From e19f65ba921ef1267503f4b1a7bba4b5fc453c37 Mon Sep 17 00:00:00 2001 From: "Chris E. Kelley" Date: Fri, 31 Mar 2023 22:51:49 -0500 Subject: [PATCH 01/43] Created UI for media/input asssignment (cherry picked from commit 1cb5fd675913d920f2ed3808f026c46acf951027) --- README.md | 2 + .../feedback-editor.component.html | 5 +- .../feedback-editor.component.ts | 2 +- .../feedback-editor/form-metadata.ts | 2 + .../media-input-editor.component.css | 6 + .../media-input-editor.component.html | 73 ++++++++++ .../media-input-editor.component.spec.ts | 23 +++ .../media-input-editor.component.ts | 137 ++++++++++++++++++ .../media-input-editor.service.spec.ts | 16 ++ .../media-input-editor.service.ts | 40 +++++ .../media-input-editor/media-input-item.ts | 10 ++ .../media-input-editor/media-list-dialog.html | 13 ++ .../ng-tangy-form-editor.module.ts | 7 +- .../ng-tangy-form-editor.component.html | 12 +- .../modules/mysql-js/conf.d/config-file.cnf | 2 +- 15 files changed, 343 insertions(+), 7 deletions(-) create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts create mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html diff --git a/README.md b/README.md index da7b4dc297..23dab8f15e 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,8 @@ export NODE_OPTIONS=--openssl-legacy-provider npm start ``` +If you are developing on an M1-based Mac, run `export NODE_OPTIONS="--openssl-legacy-provider"` in your command shell before running `npm start`. + View the app at . If using ngrok.io or tunnelto.dev, use the 'start-using-proxy' instead of 'start' command. This will add some switches that enable the use of some older libraries. diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html index ba4c160eae..2ac24bb623 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html @@ -1,4 +1,5 @@ -
+
+

{{'Feedback Editor'|translate}}

@@ -9,7 +10,7 @@ - {{'Feedback Editor'|translate}} +
diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts index 90930f35c9..9a05d5783f 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts @@ -39,7 +39,7 @@ export class FeedbackEditorComponent implements OnInit { public feedbackService:FeedbackService, private route: ActivatedRoute, public data: FormMetadata, - private http: HttpClient) {} + private http: HttpClient ) {} async ngOnInit() { this.feedback = this.getFeedback() diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts b/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts index 269cc79a10..e1983ba010 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts @@ -1,5 +1,6 @@ import {Feedback} from "./feedback"; import { Injectable } from "@angular/core"; +import {MediaInput} from "../media-input-editor/media-input-item"; @Injectable() export class FormMetadata { @@ -7,4 +8,5 @@ export class FormMetadata { title: string; src: string; feedbackItems:Array + mediaInputItems:Array } diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css new file mode 100644 index 0000000000..b46b619269 --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css @@ -0,0 +1,6 @@ +mat-card-content { + width: 100% +} +#media-inputs-editor { + margin-left: 1em; +} \ No newline at end of file diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html new file mode 100644 index 0000000000..336e752844 --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html @@ -0,0 +1,73 @@ +
+ + + + + + + + + + + + + + + +
+

{{'Media Input Editor'|translate}}

+

{{'If the media elements are not available, add them to the '|translate}}{{'Media Library'|translate}}.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Title {{element.title}} Field Name {{element.id}} Media Elements + + +
    +
  • + {{item}} +
  • +
+
+
Controls + + +
+ +
+ + + + + +
diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts new file mode 100644 index 0000000000..b0ffe84fb8 --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MediaInputEditorComponent } from './media-input-editor.component'; + +describe('MediaInputEditorComponent', () => { + let component: MediaInputEditorComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MediaInputEditorComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MediaInputEditorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts new file mode 100644 index 0000000000..5d0482befd --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts @@ -0,0 +1,137 @@ +import {AfterContentInit, Component, ElementRef, Inject, Input, OnInit, ViewChild} from '@angular/core'; +import {HttpClient} from "@angular/common/http"; +import {FeedbackService} from "../feedback-editor/feedback.service"; +import {FormMetadata} from "../feedback-editor/form-metadata"; +import {Feedback} from "../feedback-editor/feedback"; +import {MediaInput} from "./media-input-item"; +import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog"; +import {MediaInputEditorService} from "./media-input-editor.service"; + +export interface DialogData { + selectedMediaElements: string[] +} + +@Component({ + selector: 'media-input-editor', + templateUrl: './media-input-editor.component.html', + styleUrls: ['./media-input-editor.component.css'] +}) + +export class MediaInputEditorComponent implements OnInit, AfterContentInit { + + @Input() groupId:string + @Input() formId:string + formItems:any + mediaItems:Array = [] + dataSource + showMediaItemsListing:boolean = true + displayedColumns: string[] = ['title','name','mediaElements','controls']; + showMediaInputForm:boolean = false; + // @ViewChild('list', {static: true}) listEl: ElementRef; + showMediaList: boolean = false + selectedMediaElements: string[] = [] + + constructor( + public feedbackService:FeedbackService, + private http: HttpClient, + public dialog: MatDialog, + public mediaInputEditorService: MediaInputEditorService + ) {} + + async ngOnInit(): Promise { + let formHtml = await this.http.get(`/editor/${this.groupId}/content/${this.formId}/form.html`, {responseType: 'text'}).toPromise() + this.formItems = await this.feedbackService.createFormItemsList(formHtml); + await this.getMediaInputsList(null); + } + + ngAfterContentInit() { + // this.listEl.nativeElement.setAttribute('endpoint', './media-list') + } + + private async getMediaInputsList(formMetaData: FormMetadata) { + if (!formMetaData) + formMetaData = await this.feedbackService.getForm(this.groupId, this.formId) + let mediaInputItems = [] + // if (formMetaData.mediaInputItems) { + // let titledMediaItems = formMetaData.mediaInputItems.map(mediaItem => { + // let formItem = this.formItems.find(item => item.id === mediaItem['formItem']) + // // mediaItem.formItemName = formItem.title + // return mediaItem + // }); + // // ORDER_BY formItem, percentile + // mediaInputItems = titledMediaItems + // } + + this.mediaItems = this.formItems.map(fi => { + if (formMetaData.mediaInputItems) { + let mediaItem = formMetaData.mediaInputItems.find(item => item.formItem === fi['id']) + if (mediaItem) { + fi['mediaElements'] = mediaItem + } + } + return fi + }) + // console.log("feedbackItems: " + JSON.stringify(this.feedbackItems)) + this.dataSource = this.mediaItems + if (this.mediaItems.length === 0) { + this.showMediaItemsListing = false + } + } + + editMediaInput(formItemId: any) { + this.showMediaInputForm = true + this.showMediaList = true + this.selectedMediaElements = [] + // this.dialog.open(MediaDialog, { + // data: { + // animal: 'panda', + // }, + // }); + // const dialogRef = this.dialog.open(MediaDialog, { + // data: {selectedMediaElements: this.selectedMediaElements}, + // }); + const dialogRef = this.dialog.open(MediaDialog); + dialogRef.afterClosed().subscribe(result => { + this.selectedMediaElements = result; + console.log("Now need to save this.selectedMediaElements: " + JSON.stringify(this.selectedMediaElements)) + let mediaInput = new MediaInput(formItemId, this.selectedMediaElements) + this.mediaInputEditorService.update(this.groupId, this.formId, mediaInput).then(async (data) => { + await this.getMediaInputsList(data) + // this.showFeedbackForm = false + // this.showFeedbackListing = true + }); + }); + } + + deleteMediaInput(groupName: any, formId: any, formItem: any) { + + } +} + +@Component({ + selector: 'media-list-dialog', + templateUrl: 'media-list-dialog.html', +}) +export class MediaDialog implements AfterContentInit { + // constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {} + @ViewChild('list', {static: true}) listEl: ElementRef; + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData) {} + + ngAfterContentInit() { + this.listEl.nativeElement.setAttribute('endpoint', './media-list') + } + selectMedia() { + const pathsThatAreSelected = this.listEl.nativeElement.shadowRoot.querySelector('file-list').files.reduce((pathsThatAreSelected, file) => { + return file.selected + ? [...pathsThatAreSelected, file.path] + : pathsThatAreSelected + }, []) + console.log("pathsThatAreSelected: " + JSON.stringify(pathsThatAreSelected)) + this.dialogRef.close(pathsThatAreSelected); + } + onNoClick(): void { + this.dialogRef.close(); + } +} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts new file mode 100644 index 0000000000..5a6f549bea --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MediaInputEditorService } from './media-input-editor.service'; + +describe('MediaInputEditorService', () => { + let service: MediaInputEditorService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(MediaInputEditorService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts new file mode 100644 index 0000000000..a3959d980f --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; +import {Feedback} from "../feedback-editor/feedback"; +import {FormMetadata} from "../feedback-editor/form-metadata"; +import {FeedbackService} from "../feedback-editor/feedback.service"; +import {MediaInput} from "./media-input-item"; +import {HttpClient} from "@angular/common/http"; + +@Injectable({ + providedIn: 'root' +}) +export class MediaInputEditorService { + + constructor(public feedbackService:FeedbackService, + private http: HttpClient) { } + + async update(groupName:string, formId:string, mediaInput: MediaInput) { + const form = await this.feedbackService.getForm(groupName, formId); + if (typeof form.mediaInputItems === 'undefined') { + form.mediaInputItems = [] + } + // delete the previous version + let feedbackItem = form.mediaInputItems.find(item => item.formItem === mediaInput.formItem) + // remove old item + const filteredItems = form.mediaInputItems.filter(item => item !== feedbackItem) + form.mediaInputItems = filteredItems + form.mediaInputItems.push(mediaInput) + let formsJson = await this.http.get>(`/editor/${groupName}/content/forms.json`).toPromise() + const updatedFormsJson = formsJson.map(formInfo => { + if (formInfo.id !== form.id) return Object.assign({}, formInfo) + return Object.assign({}, formInfo, form) + }) + let file = { + groupId: groupName, + filePath:`./forms.json`, + fileContents: JSON.stringify(updatedFormsJson) + } + await this.http.post('/editor/file/save', file).toPromise() + return form + } +} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts new file mode 100644 index 0000000000..55b45fcd3d --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts @@ -0,0 +1,10 @@ +export class MediaInput { + formItem:string; + mediaElements:Array + + + constructor(formItem: string, mediaElements: Array) { + this.formItem = formItem; + this.mediaElements = mediaElements; + } +} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html new file mode 100644 index 0000000000..9db2683afb --- /dev/null +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html @@ -0,0 +1,13 @@ + +

Media Listing

+
+ +
+
+ + + + + +
+ \ No newline at end of file diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts index f7a4292af2..0481eb215f 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts @@ -16,6 +16,8 @@ import {FeedbackService} from "./feedback-editor/feedback.service"; import {MatTableModule} from '@angular/material/table'; import {FormMetadata} from "./feedback-editor/form-metadata"; import {MatCardModule} from '@angular/material/card'; +import {MediaInputEditorComponent, MediaDialog} from './media-input-editor/media-input-editor.component'; +import {MatDialogModule} from "@angular/material/dialog"; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], @@ -31,12 +33,13 @@ import {MatCardModule} from '@angular/material/card'; MatButtonModule, MatTableModule, MatCardModule, - SharedModule + SharedModule, + MatDialogModule ], exports: [ NgTangyFormEditorComponent ], - declarations: [NgTangyFormEditorComponent, FeedbackEditorComponent], + declarations: [NgTangyFormEditorComponent, FeedbackEditorComponent, MediaInputEditorComponent, MediaDialog], providers:[FeedbackService, FormMetadata] }) export class NgTangyFormEditorModule { } diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html index 076afbaeb2..8bdb03b514 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html @@ -9,6 +9,16 @@ {{'Feedback Editor'|translate}} - + + + + + + + {{'Media Input Editor'|translate}} + + + + \ No newline at end of file diff --git a/server/src/modules/mysql-js/conf.d/config-file.cnf b/server/src/modules/mysql-js/conf.d/config-file.cnf index 47d12830b9..dc397289cf 100644 --- a/server/src/modules/mysql-js/conf.d/config-file.cnf +++ b/server/src/modules/mysql-js/conf.d/config-file.cnf @@ -1,4 +1,4 @@ [mysqld] innodb-strict-mode=OFF innodb-page-size=64K -innodb-log-buffer-size=128M +innodb-log-buffer-size=128M From 747e3e79ad0ab1346b078cf73e9c7bf6db85bb5a Mon Sep 17 00:00:00 2001 From: "Chris E. Kelley" Date: Tue, 14 Nov 2023 18:33:49 -0800 Subject: [PATCH 02/43] Got media uploads working again #3583 Updated file-list-component and vaadin-upload libs Create media dir is missing. A little UI work --- editor/package.json | 4 ++-- .../app/groups/group-media/group-media.component.css | 4 ++++ .../groups/group-media/group-media.component.html | 10 +++++++++- .../media-input-editor.component.html | 4 ++-- editor/src/polyfills.ts | 2 +- server/src/routes/group-media-list.js | 12 +++++++++++- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/editor/package.json b/editor/package.json index 93918cdfe6..a65f22230f 100644 --- a/editor/package.json +++ b/editor/package.json @@ -33,13 +33,13 @@ "@queso/snake-case": "^0.2.0", "@ts-stack/markdown": "1.4.0", "@types/ua-parser-js": "^0.7.35", - "@vaadin/vaadin-upload": "^4.3.0", + "@vaadin/vaadin-upload": "^4.4.3", "@webcomponents/webcomponentsjs": "^2.4.3", "axios": "^0.21.1", "core-js": "^2.6.11", "couchdb-conflict-manager": "0.0.8", "fast-json-patch": "^3.0.0-1", - "file-list-component": "1.3.2", + "file-list-component": "1.4.0", "json-diff": "^0.5.4", "jwt-decode": "^2.2.0", "moment": "^2.23.0", diff --git a/editor/src/app/groups/group-media/group-media.component.css b/editor/src/app/groups/group-media/group-media.component.css index e69de29bb2..32dcb25808 100644 --- a/editor/src/app/groups/group-media/group-media.component.css +++ b/editor/src/app/groups/group-media/group-media.component.css @@ -0,0 +1,4 @@ +.file-list { + margin-top: 1em; + margin-left: 1em; +} \ No newline at end of file diff --git a/editor/src/app/groups/group-media/group-media.component.html b/editor/src/app/groups/group-media/group-media.component.html index cdcf7c9f6d..c358b040f7 100644 --- a/editor/src/app/groups/group-media/group-media.component.html +++ b/editor/src/app/groups/group-media/group-media.component.html @@ -1,6 +1,14 @@
+ +
+
+ + + remove selected files + +
- + diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html index 336e752844..6f5e43fbbc 100644 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html @@ -23,13 +23,13 @@

{{'Media Input Editor'|translate}}

- Field Title + Section Title {{element.title}} - Field Name + Section Name {{element.id}} diff --git a/editor/src/polyfills.ts b/editor/src/polyfills.ts index 23ed640be7..7fd863e7e8 100644 --- a/editor/src/polyfills.ts +++ b/editor/src/polyfills.ts @@ -108,7 +108,7 @@ import 'tangy-form-editor/tangy-form-editor.js' import './app/couchdb-conflict-manager/src/couchdb-conflict-manager.js' // @TODO Remove this when this element has been added to tangy-form-editor. // import 'tangy-form/input/tangy-ethio-date.js'; -// import '@vaadin/vaadin-upload/vaadin-upload.js' +import '@vaadin/vaadin-upload/vaadin-upload.js' // import '@polymer/paper-radio-button/paper-radio-button.js'; // import '@polymer/paper-radio-group/paper-radio-group.js'; diff --git a/server/src/routes/group-media-list.js b/server/src/routes/group-media-list.js index 3ad2d7c9cb..6793389a8f 100644 --- a/server/src/routes/group-media-list.js +++ b/server/src/routes/group-media-list.js @@ -3,12 +3,22 @@ const clog = require('tangy-log').clog const log = require('tangy-log').log const util = require('util') const readDir = util.promisify(require('fs').readdir) +const mkdir = util.promisify(require('fs').mkdir) const stat = util.promisify(require('fs').stat) // source: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript function formatBytes(a,b){if(0==a)return"0 Bytes";var c=1024,d=b||2,e=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],f=Math.floor(Math.log(a)/Math.log(c));return parseFloat((a/Math.pow(c,f)).toFixed(d))+" "+e[f]} module.exports = async (req, res) => { - const list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) + let list + try { + list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) + } catch (e) { + console.error(e) + if (e.code === 'ENOENT') { + mkdir(`/tangerine/client/content/groups/${req.params.group}/media`) + list = [] + } + } const files = [] for (let dirent of list) { files.push({ From 4e73780d84efac53dfdac46823d234e331821477 Mon Sep 17 00:00:00 2001 From: "Chris E. Kelley" Date: Tue, 12 Dec 2023 15:17:50 -0800 Subject: [PATCH 03/43] Display attendanceForms for Spreadsheet requests only when useAttendanceFeature. --- .../new-csv-data-set.component.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/editor/src/app/groups/new-csv-data-set/new-csv-data-set.component.ts b/editor/src/app/groups/new-csv-data-set/new-csv-data-set.component.ts index 35a09aa3d4..b22cff545c 100644 --- a/editor/src/app/groups/new-csv-data-set/new-csv-data-set.component.ts +++ b/editor/src/app/groups/new-csv-data-set/new-csv-data-set.component.ts @@ -73,18 +73,22 @@ export class NewCsvDataSetComponent implements OnInit { const csvTemplates = (await this.formsService.listCsvTemplates(this.groupId)) const config = await this.serverConfig.getServerConfig() const appConfig = await this.http.get('./assets/app-config.json').toPromise() - const appendedForms = >[ - {id: 'participant',title:_TRANSLATE('Participant')}, - {id: 'event-form',title:_TRANSLATE('Event Form')}, - {id: 'case-event',title: _TRANSLATE('Case Event')}] + + let forms = await this.formsService.getFormsInfo(this.groupId) if (appConfig.teachProperties?.useAttendanceFeature) { - appendedForms.push({id: 'attendance', title: _TRANSLATE('Attendance')}) - appendedForms.push({id: 'behavior', title: _TRANSLATE('Behavior')}) - appendedForms.push({id: 'scores', title: _TRANSLATE('Scores')}) + const attendanceForms = >[ + {id: 'attendance', title: _TRANSLATE('Attendance')}, + {id: 'behavior', title: _TRANSLATE('Behavior')}, + {id: 'scores', title: _TRANSLATE('Scores')} + ] + forms = [...forms, ...attendanceForms] } - let forms = await this.formsService.getFormsInfo(this.groupId) - if(config.enabledModules.includes('case')){ - forms = [...forms, ...appendedForms] + if (config.enabledModules.includes('case')) { + const caseForms = >[ + {id: 'participant', title: _TRANSLATE('Participant')}, + {id: 'event-form', title: _TRANSLATE('Event Form')}, + {id: 'case-event', title: _TRANSLATE('Case Event')}] + forms = [...forms, ...caseForms] } this.forms = forms.map(form => { return { From 806506e4a93055cadc61a8b4edda97289da19267 Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 14 Dec 2023 13:59:30 -0500 Subject: [PATCH 04/43] Add default 'about' template form to content sets --- content-sets/attendance/client/forms.json | 17 + .../case-module-starter/client/forms.json | 27 + content-sets/case-module/client/forms.json | 27 + content-sets/custom-app/client/forms.json | 27 + .../data-conflict-tools/client/forms.json | 27 + content-sets/default/client/forms.json | 17 + content-sets/teach/client/.gitignore | 1 + content-sets/teach/client/README.md | 21 + content-sets/teach/client/about/form.html | 40 + .../teach/client/app-config.defaults.json | 6 +- content-sets/teach/client/case-export.json | 1848 +++++++++++++++++ .../client/case-type-1-manifest/form.html | 11 + content-sets/teach/client/case-type-1.json | 542 +++++ .../client/case-type-2-manifest/form.html | 11 + content-sets/teach/client/case-type-2.json | 77 + .../client/change-location-of-case/form.html | 9 + .../teach/client/components/basic-setup.js | 18 + .../teach/client/components/custom-app.js | 37 + .../teach/client/components/find-case.js | 161 ++ .../components/find-participant-by-case.js | 94 + .../find-participant-by-data-and-location.js | 70 + .../find-participant-by-location-and-data.js | 160 ++ .../client/components/find-participant.js | 182 ++ .../teach/client/components/home-component.js | 21 + .../teach/client/components/page-1.js | 26 + .../teach/client/components/page-2.js | 26 + .../client/components/select-participant.js | 80 + .../create-an-urgent-notification/form.html | 25 + .../teach/client/custom-generators.js | 80 + content-sets/teach/client/custom-report.js | 10 + .../form.html | 13 + content-sets/teach/client/example/form.html | 553 +---- .../client/form-internal-behaviour/form.html | 319 +++ .../form-that-syncs-up-but-not-down/form.html | 7 + .../form-with-alternative-template/alt.html | 28 + .../form-with-alternative-template/form.html | 30 + content-sets/teach/client/forms.json | 68 +- content-sets/teach/client/index.html | 1 + content-sets/teach/client/index.js | 1 + content-sets/teach/client/itemized-report.js | 23 + .../client/load-testing-definitions.json | 13 + .../form.html | 21 + .../form.html | 16 + .../qr-code-for-registering-case-type-1.png | Bin 0 -> 3265 bytes content-sets/teach/client/queries.js | 35 + .../client/registration-role-1/form.html | 109 + .../client/registration-role-2/form.html | 61 + content-sets/teach/client/reports.html | 3 + content-sets/teach/client/reports.js | 6 + .../resolve-an-urgent-notification/form.html | 15 + .../teach/client/select-participant.js | 63 + .../teach/client/skip-section/form.html | 61 + .../client/student-registration/form.html | 6 + .../teach/client/summarized-report.js | 17 + .../template-event-form-listing/form.html | 11 + .../client/template-event-listing/form.html | 11 + content-sets/teach/client/test-form/form.html | 5 + .../test-issues-created-on-client/form.html | 17 + .../form.html | 17 + .../print-me.html | 4 + .../client/transfer-participant/form.html | 5 + .../teach/client/user-profile/form.html | 15 +- .../teach/client/workflow-form-1/form.html | 14 + .../teach/client/workflow-form-2/form.html | 14 + .../teach/client/workflow-form-3/form.html | 13 + 65 files changed, 4713 insertions(+), 580 deletions(-) create mode 100644 content-sets/teach/client/.gitignore create mode 100644 content-sets/teach/client/README.md create mode 100755 content-sets/teach/client/about/form.html create mode 100644 content-sets/teach/client/case-export.json create mode 100644 content-sets/teach/client/case-type-1-manifest/form.html create mode 100644 content-sets/teach/client/case-type-1.json create mode 100644 content-sets/teach/client/case-type-2-manifest/form.html create mode 100644 content-sets/teach/client/case-type-2.json create mode 100644 content-sets/teach/client/change-location-of-case/form.html create mode 100644 content-sets/teach/client/components/basic-setup.js create mode 100644 content-sets/teach/client/components/custom-app.js create mode 100644 content-sets/teach/client/components/find-case.js create mode 100644 content-sets/teach/client/components/find-participant-by-case.js create mode 100644 content-sets/teach/client/components/find-participant-by-data-and-location.js create mode 100644 content-sets/teach/client/components/find-participant-by-location-and-data.js create mode 100644 content-sets/teach/client/components/find-participant.js create mode 100644 content-sets/teach/client/components/home-component.js create mode 100644 content-sets/teach/client/components/page-1.js create mode 100644 content-sets/teach/client/components/page-2.js create mode 100644 content-sets/teach/client/components/select-participant.js create mode 100644 content-sets/teach/client/create-an-urgent-notification/form.html create mode 100644 content-sets/teach/client/custom-generators.js create mode 100644 content-sets/teach/client/custom-report.js create mode 100644 content-sets/teach/client/dynamically-make-an-optional-form-required/form.html create mode 100644 content-sets/teach/client/form-internal-behaviour/form.html create mode 100644 content-sets/teach/client/form-that-syncs-up-but-not-down/form.html create mode 100644 content-sets/teach/client/form-with-alternative-template/alt.html create mode 100644 content-sets/teach/client/form-with-alternative-template/form.html create mode 100644 content-sets/teach/client/index.html create mode 100644 content-sets/teach/client/index.js create mode 100644 content-sets/teach/client/itemized-report.js create mode 100644 content-sets/teach/client/load-testing-definitions.json create mode 100644 content-sets/teach/client/mark-form-as-required-example--form-1/form.html create mode 100644 content-sets/teach/client/mark-form-as-required-example--form-2/form.html create mode 100644 content-sets/teach/client/qr-code-for-registering-case-type-1.png create mode 100644 content-sets/teach/client/queries.js create mode 100644 content-sets/teach/client/registration-role-1/form.html create mode 100644 content-sets/teach/client/registration-role-2/form.html create mode 100644 content-sets/teach/client/reports.html create mode 100644 content-sets/teach/client/reports.js create mode 100644 content-sets/teach/client/resolve-an-urgent-notification/form.html create mode 100644 content-sets/teach/client/select-participant.js create mode 100644 content-sets/teach/client/skip-section/form.html create mode 100644 content-sets/teach/client/summarized-report.js create mode 100644 content-sets/teach/client/template-event-form-listing/form.html create mode 100644 content-sets/teach/client/template-event-listing/form.html create mode 100644 content-sets/teach/client/test-form/form.html create mode 100644 content-sets/teach/client/test-issues-created-on-client/form.html create mode 100644 content-sets/teach/client/test-issues-created-programatically-on-client/form.html create mode 100644 content-sets/teach/client/test-issues-created-programatically-on-client/print-me.html create mode 100644 content-sets/teach/client/transfer-participant/form.html create mode 100644 content-sets/teach/client/workflow-form-1/form.html create mode 100644 content-sets/teach/client/workflow-form-2/form.html create mode 100644 content-sets/teach/client/workflow-form-3/form.html diff --git a/content-sets/attendance/client/forms.json b/content-sets/attendance/client/forms.json index 2efda7bc2c..ab3ec11494 100755 --- a/content-sets/attendance/client/forms.json +++ b/content-sets/attendance/client/forms.json @@ -59,6 +59,23 @@ "filterByLocation" : true } }, + { + "title": "About", + "src": "./assets/about/form.html", + "id": "about", + "customSyncSettings" : { + "pull" : false, + "enabled" : false, + "excludeIncomplete" : false, + "push" : false + }, + "couchdbSyncSettings" : { + "pull" : true, + "enabled" : true, + "push" : true, + "filterByLocation" : true + } + }, { "id": "form-internal-behaviour", "type": "form", diff --git a/content-sets/case-module-starter/client/forms.json b/content-sets/case-module-starter/client/forms.json index 392170e33e..f5368fdc8f 100644 --- a/content-sets/case-module-starter/client/forms.json +++ b/content-sets/case-module-starter/client/forms.json @@ -1,4 +1,31 @@ [ + { + "id" : "about", + "src" : "./assets/about/form.html", + "description" : "User Profile", + "listed" : false, + "title" : "About", + "type" : "about", + "searchSettings" : { + "shouldIndex" : false, + "primaryTemplate" : "", + "secondaryTemplate" : "", + "variablesToIndex" : [ + ] + }, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } + }, { "id" : "user-profile", "src" : "./assets/user-profile/form.html", diff --git a/content-sets/case-module/client/forms.json b/content-sets/case-module/client/forms.json index 4bf3a4012c..b6d1f1587c 100644 --- a/content-sets/case-module/client/forms.json +++ b/content-sets/case-module/client/forms.json @@ -1,4 +1,31 @@ [ + { + "id" : "about", + "src" : "./assets/about/form.html", + "description" : "User Profile", + "listed" : false, + "title" : "About", + "type" : "about", + "searchSettings" : { + "shouldIndex" : false, + "primaryTemplate" : "", + "secondaryTemplate" : "", + "variablesToIndex" : [ + ] + }, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } + }, { "id" : "user-profile", "src" : "./assets/user-profile/form.html", diff --git a/content-sets/custom-app/client/forms.json b/content-sets/custom-app/client/forms.json index 30155a6dcc..d381e3cc74 100644 --- a/content-sets/custom-app/client/forms.json +++ b/content-sets/custom-app/client/forms.json @@ -1,4 +1,31 @@ [ + { + "id" : "about", + "src" : "./assets/about/form.html", + "description" : "User Profile", + "listed" : false, + "title" : "About", + "type" : "about", + "searchSettings" : { + "shouldIndex" : false, + "primaryTemplate" : "", + "secondaryTemplate" : "", + "variablesToIndex" : [ + ] + }, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } + }, { "id" : "user-profile", "src" : "./assets/user-profile/form.html", diff --git a/content-sets/data-conflict-tools/client/forms.json b/content-sets/data-conflict-tools/client/forms.json index c4d100edaf..921f7d307b 100755 --- a/content-sets/data-conflict-tools/client/forms.json +++ b/content-sets/data-conflict-tools/client/forms.json @@ -11,6 +11,33 @@ } ] }, + { + "id" : "about", + "src" : "./assets/about/form.html", + "description" : "User Profile", + "listed" : false, + "title" : "About", + "type" : "about", + "searchSettings" : { + "shouldIndex" : false, + "primaryTemplate" : "", + "secondaryTemplate" : "", + "variablesToIndex" : [ + ] + }, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } + }, { "title": "User Profile", "src": "./assets/user-profile/form.html", diff --git a/content-sets/default/client/forms.json b/content-sets/default/client/forms.json index c4d100edaf..17cbe84a58 100755 --- a/content-sets/default/client/forms.json +++ b/content-sets/default/client/forms.json @@ -11,6 +11,23 @@ } ] }, + { + "id" : "about", + "src" : "./assets/about/form.html", + "listed" : false, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } + }, { "title": "User Profile", "src": "./assets/user-profile/form.html", diff --git a/content-sets/teach/client/.gitignore b/content-sets/teach/client/.gitignore new file mode 100644 index 0000000000..5d8f9467a6 --- /dev/null +++ b/content-sets/teach/client/.gitignore @@ -0,0 +1 @@ +app-config.json diff --git a/content-sets/teach/client/README.md b/content-sets/teach/client/README.md new file mode 100644 index 0000000000..253cf3fc05 --- /dev/null +++ b/content-sets/teach/client/README.md @@ -0,0 +1,21 @@ +# Content Set: Custom App + +## Install and preview +Install node.js on your computer and then run the following commands to set up your sandbox. + +```bash +npm uninstall -g tangerine-preview +npm install -g tangerine-preview@3.14.0-prerelease-5 +git clone git@github.com:ICTatRTI/tangerine-project--lakana--lakana-forms-dev.git +cd tangerine-project--lakana--lakana-forms-dev +cd client +cp app-config.defaults.json app-config.json +``` + +To run your preview, open the repository on the command line and run... +``` +cd client +tangerine-preview +``` + + diff --git a/content-sets/teach/client/about/form.html b/content-sets/teach/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/teach/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/teach/client/app-config.defaults.json b/content-sets/teach/client/app-config.defaults.json index 752498151f..3f26fdab92 100755 --- a/content-sets/teach/client/app-config.defaults.json +++ b/content-sets/teach/client/app-config.defaults.json @@ -8,10 +8,10 @@ "passwordPolicy":"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}", "passwordRecipe":"Must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters", "serverUrl": "http://localhost/", - "uploadUnlockedFormReponses": true, + "uploadUnlockedFormReponses": false, "groupName": "", - "uploadToken": "password", - "homeUrl": "dashboard", + "uploadToken": "change_this_token", + "homeUrl": "case-management", "centrallyManagedUserProfile": false, "languageDirection": "ltr", "languageCode": "en", diff --git a/content-sets/teach/client/case-export.json b/content-sets/teach/client/case-export.json new file mode 100644 index 0000000000..b90376757d --- /dev/null +++ b/content-sets/teach/client/case-export.json @@ -0,0 +1,1848 @@ +[ + { + "_id": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "", + "complete": false, + "linearMode": true, + "hideClosedItems": true, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "case-type-1-manifest", + "tagName": "TANGY-FORM" + }, + "items": [ + { + "id": "item1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": true, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "status", + "value": "enrolled" + }, + { + "name": "participant_id", + "value": "810004" + }, + { + "name": "first_name", + "value": "Foo" + }, + { + "name": "last_name", + "value": "Bar" + }, + { + "name": "e3158705-fa46-4c6b-a4ab-17842b082a7e-title", + "value": "rock-n-roll" + } + ], + "open": true, + "incomplete": true, + "disabled": false, + "hidden": false, + "locked": false, + "isDirty": false, + "firstOpenTime": 1608172025357, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": false, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:27:05 PM", + "startUnixtime": 1608172025347, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "case", + "events": [ + { + "id": "93250c56-9f60-4e3d-a5de-a92df4a3080e", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "Registration", + "complete": false, + "estimate": true, + "caseEventDefinitionId": "event-type-1", + "eventForms": [ + { + "id": "c35d8155-987f-442f-bdc7-b284f081fc95", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "", + "caseEventId": "93250c56-9f60-4e3d-a5de-a92df4a3080e", + "eventFormDefinitionId": "event-form-definition-rce86e", + "formResponseId": "bf795dd2-5eac-43da-8584-706f60242d27" + } + ], + "startDate": 0 + }, + { + "id": "4682fdbb-d55c-44b5-bb64-470e1a220333", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "An Event with an Event Form you can delete", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "event-with-an-event-form-you-can-delete", + "eventForms": [ + { + "id": "4572b0e5-6557-4503-9387-f004ddd28a2a", + "complete": true, + "required": false, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "4682fdbb-d55c-44b5-bb64-470e1a220333", + "eventFormDefinitionId": "event-form-definition-zafbe02", + "formResponseId": "54cb2456-16bd-4ae1-9ad1-a3a4fb24a600" + } + ], + "startDate": 0 + }, + { + "id": "257bc9fd-6f58-4aa6-9d00-73df0f0c8e46", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "An Event that marks Skipped Inputs inside a Section", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "event-with-skip-section-feature", + "eventForms": [ + { + "id": "7a3cfb27-15fc-4e10-a501-328fb3b23896", + "complete": true, + "required": false, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "257bc9fd-6f58-4aa6-9d00-73df0f0c8e46", + "eventFormDefinitionId": "event-form-skip-section", + "formResponseId": "5ed2d12b-6f1b-4441-afa8-80c98ded5fb5" + } + ], + "startDate": 0 + }, + { + "id": "16fe2f63-6578-4613-9cbd-f36dcdb2384b", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "Test the Event completion logic", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "test-event-completion-logic", + "eventForms": [ + { + "id": "aac38b6a-b1a8-48ef-bfba-117673ae92cf", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "16fe2f63-6578-4613-9cbd-f36dcdb2384b", + "eventFormDefinitionId": "event-form-definition-zafbe02", + "formResponseId": "00b1c24e-1459-4533-bb37-6222a3bae234" + }, + { + "id": "7cf4f80c-297a-4f19-aea5-cf7cb5881f8f", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "16fe2f63-6578-4613-9cbd-f36dcdb2384b", + "eventFormDefinitionId": "event-form-definition-81b9i90" + } + ], + "startDate": 0 + }, + { + "id": "e3158705-fa46-4c6b-a4ab-17842b082a7e", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "Template Event listing", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "template-event-listing", + "eventForms": [ + { + "id": "0004a86d-f2b2-4ffe-a319-dace217bf205", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "e3158705-fa46-4c6b-a4ab-17842b082a7e", + "eventFormDefinitionId": "event-form-definition-3f8fsg", + "formResponseId": "400e3cdb-2ceb-4b1f-9818-0749365dd6c7" + } + ], + "startDate": 0 + }, + { + "id": "7001b2d9-884b-444c-842e-7d6a433bb396", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "Template Event Form listing", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "template-event-form-listing", + "eventForms": [ + { + "id": "8612aa12-dc09-45be-80d0-0e1a87ee9f1b", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "7001b2d9-884b-444c-842e-7d6a433bb396", + "eventFormDefinitionId": "event-form-definition-Id20b2k", + "formResponseId": "a9c3c624-9db0-476b-a781-90b95d548277", + "data": { + "title": "almightie frumpus" + } + } + ], + "startDate": 0 + }, + { + "id": "c31189f2-f29d-49c8-bde1-b0a34ca6378d", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "Mark a form as required example", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "mark-form-as-required-example", + "eventForms": [ + { + "id": "f3bbc322-59ba-4c83-8391-c5f7f9239dd3", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "c31189f2-f29d-49c8-bde1-b0a34ca6378d", + "eventFormDefinitionId": "event-form--mark-form-as-required-example-1", + "formResponseId": "aa80b05b-843b-486c-8c95-9ede1ea4c43e" + }, + { + "id": "708aefe4-4760-4b9d-aac3-a4fdaa130de9", + "complete": true, + "required": true, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "c31189f2-f29d-49c8-bde1-b0a34ca6378d", + "eventFormDefinitionId": "event-form--mark-form-as-required-example-2", + "formResponseId": "94aae64c-c24e-4e28-a596-5b2618b04e91" + } + ], + "startDate": 0 + }, + { + "id": "373b07f4-e4f0-4555-a282-2ff3f7f49441", + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "name": "An Event with an Event Form you can delete", + "complete": true, + "estimate": true, + "caseEventDefinitionId": "event-with-an-event-form-you-can-delete", + "eventForms": [ + { + "id": "b83f5830-5d6d-4fb6-8da0-56389d61133d", + "complete": true, + "required": false, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseEventId": "373b07f4-e4f0-4555-a282-2ff3f7f49441", + "eventFormDefinitionId": "event-form-definition-zafbe02", + "formResponseId": "2a6e4fb1-8819-4cd7-87cb-7a6fdc00342d" + } + ], + "startDate": 0 + } + ], + "participants": [ + { + "id": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "caseRoleId": "role-1", + "data": { + "participant_id": "810004", + "first_name": "Foo", + "last_name": "Bar" + } + } + ], + "disabledEventDefinitionIds": [], + "notifications": [ + { + "id": "5f33c60d-35e9-405d-bbc2-8dfa9b053335", + "status": "Closed", + "createdAppContext": "CLIENT", + "createdOn": 1608172120132, + "label": "Registration success!", + "description": "\n Thank you for registering \n Foo\n Bar.\n\n We have created 0 additional participants for you.\n Please complete their registration forms.\n ", + "link": "", + "icon": "thumb_up", + "color": "#b2fba5", + "enforceAttention": false, + "persist": false + } + ], + "caseDefinitionId": "case-type-1", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172392534, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172392534, + "_rev": "31-8fa4da540286232f567a7b242e070021" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Role 1 Registration", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "registration-role-1", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item1", + "title": "Screening", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": false, + "inputs": [ + { + "name": "first_name", + "private": false, + "label": "First name", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": true, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "Foo", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + }, + { + "name": "last_name", + "private": false, + "label": "Last name", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": true, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "Bar", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + }, + { + "name": "screening_date", + "private": false, + "label": "Screening date", + "innerLabel": " ", + "placeholder": "", + "hintText": "", + "type": "date", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "2020-12-16", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + }, + { + "hideButtons": false, + "hideHelpText": false, + "name": "consent", + "value": [ + { + "hideButton": false, + "name": "yes", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "no", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "", + "required": false, + "label": "Does participant consent to participate?", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTONS" + }, + { + "name": "signature", + "hintText": "", + "label": "Participant's signature for consent.", + "errorText": "", + "private": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "value": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAEsAlgDASIAAhEBAxEB/8QAHQABAAICAwEBAAAAAAAAAAAAAAcIBgkDBAUCAf/EAFEQAAEDAwMCBAMEBgUFDAsAAAEAAgMEBQYHCBESIQkTMUEUIlEVMmFxFiNCUoGRFxgkM6FDV2JjsSVTVnKCkpSVltHS0xkmNFVlg5Oks8Hh/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ANqaIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAix7OdRMD0xsUmT6iZhZ8btUR6TV3Osjp4y7jkNaXkdTjweGjkn2CqXkXifYJkV9lwza9pLmutN/j++bTQy0lDECSA58z43SNbz+0Ygzjv1ILqoqQCHxYdWAbhDX6WaK0L+8VI6MXSva0+nWSyoiLgPxZ7Dp9V9/1avEhu76g37fpbaQEBkZt+IUo6gR8xIbHF0EexHJ9+Qgu4ipIzYxuwrJhUXvxIdQHu6A3oobM6laD/AMmsIPr69IK7tHsd3K0Epnp/EU1Nc8tLeJ7eJm/819QR/H1QXORU8n2o72aSlZFZfEVvDzBFGyNlbgdHIXFoAJdKZi488E8kOP1J7leBV6YeLTjldUS2TclpZl9E0ARNu1ljoZnd/XogoukH85SOyC8SLX5Wa5eLNpvUTOy3bDhOa2yDv8RYZuZZQAOehsdU6T+Bg5J547JT+KlluHSmDXjZbqdhrYSBNPTxSTDp7cvDamGnHHJ7DrI4I+bug2BoqmYP4pWy7NIA6o1MqcaqTwfhb5aqiFwBIHPmRtfD6uHbr54BPoCVMWK7pdtmbmOPFtecCuE8o5ZTMyClbUEcA/3Tnh49fdv4IJRRfEUsVREyeCVkkcjQ9j2OBa5pHIII9QQvtAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAVIdyviM0+PZhJoJtTxWTU7VKaV9FJ8LA+agts7ez2uLePPezuXdLhGzg9b+WuYJO3/AO4C6be9ud3vWI1IjzHJZ4sdxtoa50gq6jkPljDSD1xwiV7D3AkEYIIPB9XZdtlsm2TRSy4w+20py6407K7KLkGNdNU18g6pIzL6vjiJMbO/HDergFzkFc9LfDczHVrJI9Y9/eolfnGRzgSwYxS1rmUFAD8xie+LpaAO3MVOGRgg/NICr04XgeE6cWKHGMAxO0Y7aYO8dFbKOOmiB4ALi1gALjwOXHufcle8iAiIgIiICIiAiIgwjMtD9GdRHSyZ5pPiGQSzNLHy3Ky01RKQXdR+d7C4fN37H17+qrxl/hS7LcqllqKLT6545NM5z3vs97qWt6iST0xzOkjYO/ZrWgDgcBY/vxu+57QDNrDu30jzKuvuDY9Rx2vKsEnkkFGIXSOJrAyMdJ6usNdM4eZC5kZBkjc5kc8bXd1ul+7HB5cv07qKmnq7c+OC8WitaG1VumeCWh/BLXMd0uLHtPDg0+jg5oCsEXhPXHTyZ9Vt13eak4G8EvbHI7zmyO49HmmkpgQfQktPb2PovWi0+8WTSSJ8+Oav6c6tUNO8mGgvVN8NVzMHoC/y4e5Hr1VB4J7H3V70QUIb4meb6Q3ODH93+1fL8CkcfLN4tRFbQSu7AuZ1dLS0E9/LmlI7eqsxo7u52469eTBpjqxZLlcJgC21TymkuHPHJAppg2R3HuWtLfx4IUtVVLTVtPLR1lPFPBMwskilYHMe09iHA9iD9CqzayeHDtS1idJcnafsw6+kh0V3xRwt0sbweQ8wtBge7kAlzoy7/SB7oLPIqJ0WmPiK7VmsGmmoNp1/wmk7Cx5G40l5hhA56YZ3vPUQ1vS3mV49OmH6SjoXv30t1XywaVZ1Yr1pbqUxwjfi+UxGB80n7tPM4NbKT+y1wY93q1hA5QWbREQEREBERAREQEREBERARYJrRrbpvt/wSs1E1RyGK1Wml5jiH3pqufoc5tPAz1klcGO4b+BJIAJGviv8W3XLPa6STb/tKud5tEU3ltqaiKsuEsoBHILKSMNjd344638cj19EG0JFrBot+3iYWZ0F0y/ZDJV2sgSyx0GI3qnmEYHLupxlm8rt7uZ278he5TeMlSY5M2j1e2t5lis7XeXII60SO6hzzwyohgIPIPyk/Xv2QbIkVQNPfFa2bZ5NFSVua3XEqmbpDI8htUkTeT7OlhMsTOPcueB+Ks9huoeA6i277W0/zaw5LRADmotNxhq428+nLo3EA/gUGQoiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIi1u63eLTeWZ/ddMNqmj5z6vtsr4mXeVlTVQ1JjH6x0NHTtbK+NruR5nmNBDeQOCCg2RItSv8A6VbezTkwVu1y0idnyvH2Bd2cH3+Uykj+a9e2+LLujiMX2xtCNUAD5vw0Fxg6jweOnqjf09+PXlBtTRa1aXxkq+hqW02abRsqtBEbpH+Vd3SvAHuGSUkXbnnk89uPdZPjHjS7a7pNFT5LgufWR0nAdMKSlqoIzx35LZw/j6cMPP0CDYGirTiXiQbLMxawUWuVrt8rvvRXekqaAsP0Lpo2sP8ABxCmHFdbtGc66P0K1bw2/F/HS2232lqXHnntxG8nnse34H6IM1REQEREBERBRzclCNUfEf286SXOMT2bELTX5zUQ8npNRzMIHuHHBLZqGHjn0DnfvcG8aqrmVLiuMeJHp9k+QFxr8z0yueN2MDjpjrKOsFXI53IBBdTyytBBPoRx3BVqkBERAREQEREBERAREQdG+WSz5LZq7HchtlNcbXc6eSkrKOpjEkVRBI0tfG9p7Oa5pIIPsVqQ1x25aveGhrBBuc26S1d706lmdHc6GUOLKGnmk70FX0uLpKc8M8uoIHS8Rh3zhrpNvq6l2tNrv1sq7Je7dTXC318L6eqpaqJssM8Txw5j2OBDmkEggjgoI6267itONzenFHqNpzcuuJ/ENwt8xAqrbVcAugmaPQj1Dh8rm8OaSCpQWqTVzQTVXw0NYTuX2501XfNJrhMI8kx90rn/AANM5/Jp5e5c6Ickw1BBdG75ZOQeZdkujWseA69aeWvU3Ta9MuNnujPp0y00w/vIJmerJGHsQfwIJaQSGbIiIChzcntT0l3RYsLHqBaDDdaNpNpv9EBHcLbJ6gxycfMznuY3ctPrwDw4TGiCjOxbXzUWx6v51sh1xyr9KMj0/Mk1jyOQyGe50LXNJZMXkkvayaJ7eXE9Jc3lwYHG8y1fagNk0w8aTFL1SciHN6CmNTFGOA8TW2Wi78/SSnZIePdvueedoKAiIgIiICIiAiIgIiINbPiwUv6YawbctLMurm27B8hv8jbjVgODgXVNJDKeoN7FkMp44PrISeAAVsRxbFcbwjHqDE8QsdFZ7Na4RBR0NHCIoYIx+y1o7DuSfzJKoB4xMf2LZdE9RZGAQ47mEjXyOHLW9bI5uDx83cUpPb6H34WxKOSOaNk0MjXxvaHNc08hwPoQfcIPpcVTS01bA+lrKeKeGQcPjlYHNd+YPYrlRBGOWbYNuOctf+lmhWCXKSRpaZ5bBTCcAjjtK1ge3+Dh6BQvkXhc7SbjWfa2H49kuA3UEuZcMXyGpgmjdyO7BM6VjPT0a0Dv6K2yIKZu2sb19LgajQ7exXZFTxn9XZdRLYK5j2j0a6t/WSge3yMb+a4Xbwd12i8sdLuc2f3evtrGufNk+nExudI1gIHW6lJc6Id/WWZh+jVdJEEB6T77Nqmsr4qPFdX7PR3SQ9H2Ve3G2Vfmf721lR0iV34Rl/v9Cp7BDgHNIII5BHuou1X2u7e9b2SnVDSTHb3VTNLHV7qUQVwB+lVF0zD+D1BkexPUXSBwrdpO6PMcMhhHMeM5IW3uyO9uhkcnBgBH7QD3duxHbgLioqit3I7t9FInt3JbZDk1ko2jz8s0zqxXR9I7F77dMWztbwC5z+WgezfpJej29TbPrlM23YLqnbG3ckMdZ7p1W+uEh5+RsU4aZHDpPPl9YH1QTeiIgIiICIiAiIgIiICIiAiIgIiICIiCuPiG6o3DSTaHn+RWaomgudwpI7JSSxcB0bqyVsL3AkHpIifIQR35A4IPBGL+GHonaNKNqmLX74O3vvmbw/pDW10VOBM6Gfh1PC6T7zgyIR9vQOc/gepP74p+I1GVbKs0mo6aSoqLDUW67sZGzqPQyrjZK78A2KWR5PsGlSvtBu9jvm1rSi4Y5Ttp6D9ELXAyJpaeh8VOyORpIJ5Iex/J9eeee/KCXkREBeXeMXxnIm9OQY7bLmOkN4rKSOYcA8gfOD2BJK9REEPZFs82qZUwsvO3jT9zncl0tPYKellPP1kha1x/mohynwotleR9b6HT664/JIO77VfaocHv3DZ3yMHqOwbx8o7evNv0QUWi8Lyswnn+gzeHrBg7WjiKJ9w+JhZ27Axwupw5oPPY+3H5r3LXo/4menTmtxjc9p1qHSQHllNmNhkpDIBx2MlKx0p57+sn079+1zUQVZt+s++3EmdOom0OwZVFG4edX4VmUERaz3cykrOHyH6APB/D3HaO/wB0vxohus2muq2ljG/K+ryfD6kUXVzxw2opRMxw5I+b079+O6s4vl7GSMdHI0Oa4EOaRyCPoUGEaca6aN6vwCfTHU/GslPT1Oht1xilnjH+nED5jPyc0LOVAmqexbaxq7UPumR6S2u3Xgv81t3sPVa6xsvtIX05YJHD6yB/t27BR43aduk0m/Xbdd499rqGIjox7UikbeKZ7R6M+MaPNhaPpHGDxx37dwxrxMKfL8MvugW4jDbVd7pU6eZuKWejt1OZnzQV3k9cZa0F36z4UQAj1M4b95zVeNVDZuj3Y6RExbjdo9xvFsgb+tyTTOqF1gIHAc80L3efGwepL3jge3ZSvo/vA25a5zMtuAaoWqW8ucY3WS4ONDcmyA8OZ8NOGyPIPYlgcOfdBMqIiAiIgIiICIiAiIgIiIOCuoaK50VRbblRwVdJVxPgqKeeMSRyxuBDmPaeQ5pBIIPYgrXDqhp5qF4aGp1ZuB0NttTetCcjq4xmGIxvJ+x3vcGiaEE8Nby7iN/o0uET/lLHLZKuCuoaK50VRbblRwVdJVxPgqKeeMSRzRuBa5j2u5DmkEgg9iCgxrSzVPBdaMFteo+nF+gu9iu8XmQTxnhzHDs6KRp7skaeWuYe4IWWLXTmmBZ34Z2o9VrLo/brjkW37Jqtr8uxaHmWbHpXcD4un5PAYOwa4kDjiKQ/3cgv1g+b4pqRiNqzvB75TXixXumbV0NbTu5ZLG7/ABa4EFrmkBzXAtcAQQg9xERBrB3fMmn8WvQNloe6SobbrGahrACWNFxrnSA9v967nnvwfyWz5axsBhfr34xmU5TE0VNm0qop4Glw6mRy01K2iLOfTqFXUTPA9fkJ9iVs5QEREBFi191W0uxdzm5NqTi1oLAHOFfeKenLQSQCet447tcP4H6LCZd3218Vht9Hrrh1zqQ5rfKtVyZcHcn0HFP1/l+fZBL6KJI90ek9UxslsptQLmx8Yla+3acZFVsLT6HqioXNHPtyVyjcPZZWdVHpfqrO/txGcIuEJP8AGaNjf8UErIofqNxFdHOIKTb1rBWdQ5647FTxt5+nMtSzj/YvNqtxeo3yNtmzzWCaRzuCKiSwwtH/AChcnf48IJyRV5qtet0Dmh1o2MZNN1P4aazObDT8M5+84CoeQfTtwfz+vSqNZd7dTK6nt2yyxUgJHRU12p9I9gHv1Mjpi7+RKDxfE+06ptQ9m2ZySMkdVYs6myOjLIy/pfBJ0yEge3kSzgn2559Apv0AzOn1E0NwDOaaodML3jdurHuc7qcJX07DI1x93B/UD+IKgDUKff7qngmV4DXaE6T2q25LaKu0SfE5dUTyCKohdE8tLIekuAeSOQ0eirr4c2om9jLtv8GEaKS6Lss+BXaptE7c0F2NzjEjviR8lNwzyw6d7G8uB/VlvADQSG0dFV77B8Sipq+ufUHb/RwOPdtNZbrJ0j8A+Tk/xcv2n058QmolkNfuS0yo2O5LBTYTJN0nnsAHzN7evqT6D1QWgRVaOh+/OujLKnfPZLYeeQ6i0voZj6Ht+tm4+h9P/wC4lfNmW8vISXV/iS5RETx/7DhkVF7k/wCQrGfX/YPQBBdJFr6qPDE1wvUb48u8Q7VC8BzegCSOs46PXpIkuD+Rzyuq/wAHfF7wW/pluZ1GvIdF5c4Plt8z8B5hk4bz34PP/wC0GwQXa1GqfQi50nxMf34fOb1t7c9288hdta/ofBU2uthDZ8/1Rkk4HU9tzt7Rz+A+CPH8SVzReDPt6tzXCw6s6s29z+OotutDw78+ikbygv2qjbpduvh953LX3nXGuwnD7/Uve+e9U99p7RcXzE8Oe8dQbPJyP8rHIefZYQfB128VTGxXnVTV65QiQPME98ozE8A9gR8Jz/EEfwWeYT4Wey7DS2WfTSqyOpbwBNe7tUTfnzHG5kR5/Fh/DhBR+57kK7ZZkNpqdAd6ses2DfaUUNxw+7wy1FTTUfcu8ioeDEB0tLeqJ8fDntJjcOoja1olrNhG4DTOz6raeVVTNZbyx/lipgMM0Mkb3RyxSNPo5r2uaSCWnjlpIIJ82w7Y9uGLhv6P6B6eUD2EOEkONUYkJBJBL/L6iRyeCT25UhWy12yy0MNrs1upaCipwWxU9NC2KKME88NY0ADuSew90HaREQEREBERAREQEREBERAREQEREHg57h1p1EwfIcBvzS625Ja6q01Yb6+TPE6N5H48OPH4qnPhX53cLTp5l21fNnNpst0ev9ZQupndjJQzTveJG893NE5nHI7Br4v3gryKju5GwVG1PdPjW9WxUIjwXJo4sS1OMMBLaKKaVjILm9sY6iA8QhzuHEmJrR80oQXiRcFDXUdzoqe5W6qiqqSriZPBPC8PZLG4Ate1w7EEEEEeoK50BERAREQEREBERAREQFGWrO2bQTXKJzdU9K7BfahzekV76fya5g49GVURbM329Hj0H0Umogq7Ftb1x0j/ALTtp3M3xlDEB5eKahsN9tPS0ENiinHTVUsY5H3HOP59uPmfd3qVo+PK3X7eb7jFuh4bLmOIvN/sXSOeZpmxgVNIz2AfG4/zCtIvwgOBa4Agjgg+6DFdOdVdNtXrC3J9Mc3s+S2x3AdPbqpsvluPPyyNHzRu7H5XgHt6LK1WvVHYVo1mmQjULTipu+kudxO8yPIMKn+AdI//AF9O3iKUHv1cBrnckOcR2WI/0n73ttshh1j06ptc8KpxwcowimbTXyBg9X1NtJ6ZTwOeIeGtHdzz6ILhIok0T3V6DbgojFppn9FV3WIO+JslXzSXOmc374fSy8SfKQQXNDm8j7xUtoCIiAiIgIi46iop6SCSqq544YYml8kkjg1rGj1JJ7AIORFDmQ7vNvljucmP27P4srvkfb7IxGjnv9b1egYYqFkpY48ej+leO/WzcLmPUzS3a1c7fTSctiumf32ns0QP73wlP8TVEfg5kZ7+xBCCdK6hornRVFtuVHBV0lXE+Cop54xJHNG4FrmPa7kOaQSCD2IK1+5PjebeGZqFVaj6eW6vv+27Kq5jsjsMRfNNiVVI4NFTBySfKPyt6j2PaN/DvKebEP013hZkRJl+43GsJp38CSgwjE2zSAduQKy4vlPPr3EDfXnsvj+pFpVey46p5hqVqYH88w5XmFZNTcn1/stO6Gn4/wBHy+n8PRBlFdu52w2zG6DLbjr1g9PbbnTsqqRz71B5ssbgSOIQ7zORwQW9PIIIIBHCjHVTxFtF8BwW45xjuN59lNBSRFrLhS4pW0lsFQ7tEySrrGQxcOfwPkL3Ec9IdxwoQuuk9f4aOqVXq/g+FsyzQbI6pj79Sto2VF2w+TkNZUQzOBkfAC4gcu7j5XkODJHR7mV8vnirbq6XTvE6+tptBdNJm1dyrYw+IXAkuaZgCARLPw6KEO7xxCWTjnrYQ9/w4cO3UYbpvfdScU0Vxq43XVWvF6kyzK8q+DimpQX+W0UtNBNOQZJJ5C53l9XmN4aQA426OAb1sqAfkW4bBMJaHf3GI4U6tkc0/wCvuNQ9ocPr5PB9eB6Kd7RabZYLVR2Oy0MNFb7fTx0tLTQt6Y4YWNDWMaPYBoAA/BdtBXtu0q9XhvmZ5ur1wvkrgBJHR5DFZad3bg8R0EMTgD9C8+n588n9RDbDV/PkeD3TJpj9+XIMnutyMn/GbPUuZ9Owbx2HuAVYBEEXY7tZ204m5suO6BafUUzTyJmY5SGUHt/lCwu9h7qR7dbLbaKVtFabfTUVOz7sNPC2Ng7cdmtAHoB/Jc80sVPE+eeVkccbS973uAa1oHJJJ9AAsDyDcFoNiTzHlOtuBWd4PT0V+SUcDue/bh8gPPyu7fgfogz9FXu8+IHszsLiyu3B4xKWkA/BOlrB6c+sDH89v8e3r2XxQ769DsgPGC2rUnLyWhzfsPT29Tc88/vUzf3T3Pbse/YoLDooHbubzG7xRnENpWs1xklALftCht1ojHJI4causY9p5Huzjg88/UdUt2t0/V2fajZbWX9hLf8AUOnZ5fyg8uZSU1Rz35HAd7c88IJ4RQOxm+q4uIln0Jx9jiByyO8XdzRyeT3NICeOPp3X4NK921yIkvG7Ky20OaOqKw6dU0fQekg8Pq6mo578EEtHoe3fgBPK1ybEjJo7v33I7fJyKakutQ7JLbTO9GxNqPNhDefc09xjJ+oYD7K1EW3TUWvDJMr3fauV0wLS8W5lltkLyG8fdhoOoDnk8B/0559TSLXPQHF9KvEV0WjumZ51dLTqPQutt1uVwySrjuNXVNbJTNb8bTSRTAEPo2ljS0ADjuHdIDaguncbvabRGJbtdKSiY4Eh1RO2MHj17uI9FE0O0Db00812DVV2Jc1xN5v9yuRc5voT8VUScnvxyV61s2ubarPKai3bf9O4p3ch0/6M0bpnckE8yOjLj3APc+yD2a7XDRa2Frblq/hNIXjlonyCkj5/LmQLGblu82q2nkVu4/TUODzG5kWUUUr2uHqC1khI9PcLPaLAMEtrDHbsJsNK13q2C2wsB7k+zfqT/Mr26enp6SFlNSwRwwxjhkcbQ1rR9AB2CCFZt7m0SBhkfuMwMgAn5LxE89vwaSV4tZ4hWzCgjEk+4HHHA+0LZ5j/ACZGT7qdarGcbrqj4utx+21E/JPmy0kb38n1PJHPuu/BBBTQsp6aFkUUbQ1jGNDWtA9AAOwCCvdF4hWzCvjMsG4HHGtB44mbPCf5PjBXo0++zZ7Us649xGGAf6yvEZ/k4Aqb62goblD8PcaKCqiDg7omjD28/XgjjleZVYRhdbCaesxCyTxEglktvic0kenYt4QR5QbwNqVyDjTbkdNB0uDeJsoooSSfoHyAn+CzOy6taV5I/wAvHdTMUujzyOmivNNOf5MeV0rjoZoneAG3bR3CK0NaWgVOPUknAPqPmjPYrC75sm2jZCwsr9uWAxAgD+w2SGiPv7wBh9/9n0CCbEVZx4fGg1lcZNMbzqNpvITyHYnmtwpQ13PqGSySMH046eOD6L4dtu3P4g90ml29rJKmnYOWW/OMcor0JuOelr6lghlZ6jlzfoeQe3AWbRUol326k7e8ypsB3v6SR43R1bnR0OfYq2oq7DWu5PT+rc0yxnpBLm9TpAeCY2tPULh4zk+OZpYKHKsRvlDebPc4RPR11DO2aCeM/tMe0kEcgj8CCEHqIiICIiAiIgIiICIiAiIgIiICx7ULAsY1Rwe+aeZnbm11kyGiloK2E8cmN446mn9l7Tw5rvVrmgjuFkKIKM7F9UMt0a1AvuwTXC5GW+YcH1GDXSblovNk7vZGwn1LGfM1oJ6WiSPt5CvMqp79NtGQ6tYraNYdHPModX9MZhdcdqqUATVsTHdb6In9vkguja7kdXU3sJXrO9nu5/HN1Wj9DnFD5FHkND00OSWlp4dQ17W/Nw0kuET+7oyeeRy0nqa4AJxREQEREBERAREQEREBERAREQEREEM617QdANfJftXOcFghyGNzZKfI7S80F2p5G8dDxURcOeW8DpEnW0fRRhBhm93bg3qwXL6PcFhlOefsbJp22/JqeLv8sNf3iqSB3JmHUeeGgK2q/CQ0FziAAOST7IIO0p3h6RalXr9BrzPccAz2ItjqMRy+n+zbj1k8DyQ89FS1x+6YnOJHBIHKnJVT3C637T9R5KjR66YJLrrksBLRj2J2v7UqqB5PBe6tYWx0JDgA5/nMe3g9u3CiKxaJeJPacOu1JprqLT4ZjkzgbViWS5HDfL5RU/7UMd1NG9kR6flY0ulDOOOvt1ELy53qTp9pfZXZFqNmtkxm2t5HxN0ro6ZjiOPlaXkdTu44a3knkcDuosp9zt2z35dAdEcvzimcOYr7cmDHrG8fVlTWNE8zfT5oKaVpHcE8KsemGa7X9CM1pazdXopneFal1ErY2ZnqRJJk0FZO09nUt0aHQsLf3o4oWtbxyfpfvFMxxLO7NDkWE5Par/a6gAxVtsrI6mB/bns+Mke/1QRc3Dd0eZA/pfq/jOC0jwWupMKsvxtWAfX+33Hqj59QOKNp9+fYcsW07R+4vjqdRaS9akVbOOZM1u892hdweR/Y5HfBs7knhkLRzx9BxMiIOhZLBYsZtsVmxuy0Fqt8A4ipKGmZBDGPo1jAGj+AXfREBEWpXxB/EQy3N8rr9te2KurH0TJn2u83i1Me+rulUHdL6SjLB1CJpBa6RneQ8hp6O8gTXvK11yvcrlcOyLaXdoLtc7yXNz3IKSTrorTbP1YfE6dhLS0+YRN09/lEIDnyOa3EsZuWD+GBkdFBjGs9hzfS/JX01PltikvFGb9aLoGNifdKSmY4Pngdw0SQtBewdP3unkV127eFxuu1Esbn5Xf/AOirFryeK2nrHSOr6yMHgeZRRlvU0fP0tnezjkkDh5JvHpL4Su07TtkFXldou2fXONoLpr1WOjphJ7ltNB0NLf8ARkMn80HSzDxdds9uuQsWm1kzbUS5Su6KdlntBhimd9B8QWS/yiK6ls3lb69TXtGlWwW42inlaDHV5bd3UjC0/wCU6ZmU3Le4PDXOJAPHPI49rIMGv2wXLLlqno/h8l90SyCpFTmGL0FP5ldjDz2dcLfx8z6X9qSnPZnHLelpJZbHAs/wzVHErdnWn+R0d8sN1i86kraV/LHt9CCDw5rgeQ5rgHNIIIBBCCq8eP8AipZzGJbnn2iem8MoI6LVbqm41UPYcctnbLET2/fI7nt6BfX9S7c3lbzLqh4g2olQJSXSQYtbYrEAT7NfDIRx6/sAdx27d7jIgp7TeFptwr3sn1IyLUnUOdrg90mS5VNIS7/5AiI9SPXngnv7qR8V2GbOsOEbbTt4w+oEbelv2rSG58jjjv8AFmTqP4nk+/qp7RBj+N6fYFho6cQwiwWMck8W22w0vrzz/dtH1P8AMrIERAREQEREBa9PExrprNuV2f3ihYBVQ5nUEEcgvDa60fISO5aeXDj6OP1Wwta899FPUZdv82oYZbg2aqtd1bfZIhIS5sMdbDM95YAS0dFDIer0PSe4DSUGwxERAREQEREBERAREQEREHj5dh+K59jldiOa4/QXuy3KIw1dDWwNlhlYfq0+49QR3BAIIIWualqcp8K/XqgsNbdLheNt+ple+KhZNMZXY1Wkxlz3uc3hvSHHkBwMsLXO+aSEhbMVAO/HSqj1h2naiYxO6CKpoLU++0M8sfV5NRRf2gcH1aXtjfESO4bK719EE9xSxVETJ4JWSRyND2PY4Frmkcggj1BC+1WTw4tYazWfaTh12u0s011x2N+NV8spLnSvpOlkby493F0BhLndyXF3JJ5Ks2gIiICIiAiIgIiICIiAiIgIiICphqvpnkO0bWe5btNGbLW1mC5IHTas43R9L+iFjus3emhJBdJGHzPe0HsDI70c/i56454IKqCSmqYWSwysLJI3tDmvaRwQQexBHsg8nDMyxfUPFbXm+FXumu9ivVMyroa2ndyyaJw7HvwQR3BaQHNIIIBBC9pUJyCe+eGzqnLkdvpKuv21Z9cg+vo4GOlfhN0lPBkjYOT8LIe/SPYFoHU1nm3osl7s+S2ahyHH7nTXG2XOnjq6OsppRJDUQvaHMkY4dnNIIII+qDvIiICIiAiIgIiICIiAiIgIiICrZfdrGfay5DcqvchrddbziTqyX7PwjFg+y2p1J1EMZXSMcairJbx1NMjWh3PHIVk0QY9g2nuCaZWGLF9PMQtGOWmE8tpLZRsp4y73cQwDqcfdx5J9yshREHQvlgsWT2ueyZJZaC7W6qb0T0ddTMnglb9HMeC1w/MKtGWeHdou68TZhohfMp0XyiU9Rr8KuclLTykc8NlpCTEY+5+RgjB57+4NpkQVCZXeItoU1/2ja8N3C47TjtLSSNx/IOgepcwg07+G9+lvW9x578+vu4d4iGgVxusWJ6rDIdH8pcPntOd2uS2j14Lm1BBh6OfRznN5Hfj1VoF4uWYXh2eWmSwZxilnyG2S/fo7pQxVUDvzZI0t/wAEHetF5tGQW6C8WG60dyoKlvXDVUk7ZoZW/Vr2ktcPyK7irFXeH9pJYrnPkWhGV5vo5eJnGWR+I3uVlFPJ7Gain8yF7OAPkaGjsPfuuSjo9+2lLeh1z0/10tMI4AqGuxe+Sd+3zMEtG7gfUMJPugsysCwDQXRjS243K86e6ZY9Yrjd6qStra2lomColleeXcykF4bySQwENHJ4A5Kjuk3lYVj/AEUuuuB5tpFWchjpcltL5LW+TtyI7lS+bSlo5Hd72evoprxnLMVzS0xX7DsmtV+tk391W2ytjqoH/wDFkjJaf4FB6yIiD8IDgWuAII4IPuqYal6B6q7WcwuevuzW2suNgrnGry/SoFzKS4dwZKq2tbyIKjpH3GN9uGhw4iN0EQRloDuH003I4U3M9Obq55gcILna6pojrrVU9+YKmLnljuQ7g92u4JaSFJqqxuA2iXyrzc7j9rWQw4Lq7SNc6rZ0gWvKIvV1PXxfdLncAebxzzwXdwySPIttO7yxa011TplntgqMC1dsMfTfMSuQMcjnNHzT0jnf30B+8OCS0Ec8t4e4LCoiICIiAiIgIig/czvC0Z2t43PcM5yCCryB8JfbcaopWvuFdIR8g6ByYoyfWV4DQOeOo8NIZPuC18wDbdpldNTdQbg2Kmo4yyjo2OAqLjVkEx00Lfd7iPX0aOXO4a0lVe8P/SXPdSMuv+/HX2IOyzPojDitA9hDLRZj2a6NrvuB7GsZGfveUHPLnGdyxDSTavrLvS1Fotye+KhlteN0RbJienoLo4mwnhwdUREl0cZ4aXNdxLK5vzhkbWsdsXjjjhjbFFG1jGNDWtaOA0D0AHsEH0iIgIiICIiAiIgIiICIiAsO1mo6e4aP51QVcfXBU41c4ZW/vMdSyAj+RWYqO9xl5OO7fNTr+17mm24deqtpaAXAx0UrhwHdieR2B7IKmeC9WGp2pX6ExNb8JnVfCCP2+aKhfyf+fx/AK+6o94PGPOsu0AXJzeBf8puVxB+oa2Gm5/8AtirwoCIiAiIgIiICIiAiIgIiICIiAiIg8fL8RxnPsYueGZlZKW72S8U76SuoqlnVHNE4dwfcH3BHBBAIIIBVALJec58L3UmPDsuqbvku2nLrh02i7SB08+J1UnJMMnH7BPcgdnta6Rg6xIx2xdeFnGD4nqTidzwbObFS3ixXiB1NW0VSzqZIw/4tcDwQ4EFpAIIIBQelabta79a6O+WO401wt1wgZVUlXSytlhnhe0OZIx7SQ5rmkEEHggrtrXPYL1qt4X+Yfolmcd0zTbPeq/8A3LvrWmasxSWV393M1v7HUe7eA1/PXHw8vidsGxzI7Bl9ioMoxa80d2tF0gbU0dbRzNlhqInDlr2Pb2IKD0kREBERAREQEREBERAREQEREBERAREQEREBERB+EBwLXAEEcEH3UR5HtR0Jv12myS24WMTyCY9T71iNZPYa57+SeuSWifH5p7n+8Dx3UuoggOs0P3F2Bpj033dXl9NGB5VJmWMUF49P2TUQNppiPxc57vxJ7nwp6vxGsbkc77J0FzWjjADBTT3S0Vsh7kkiTzYR7Ds4evp7qzKIKvjchuzx0855sTvklOw8Oq8XzK3XUyDt3bAfLkHr6H6evrx+N3/YPaWk6iaE654M1g5kmveCVBgHA7lslO6UOb6jn/YrQogrrY/EM2Z36o+Ep9d7NQzgkOju1LV21zCPZ3xMUfB/NeLrLj+0TdjQUFxtOuWH0WaWT9fjuW41ktILrapgQW8OZJ1PZ1OHVE/948dDiHCyV5xrHMjjEOQ4/bbpGBwGVtJHOB359Hg+/dYFeNru2rIA77a2+6cVjnAjzJMXojIOTyeH+X1Dv9CghLTndRm2i9/t2kG82W20rrhJ8NjOp1AQLFkXBIDKhzflo6kcHqDy1pIcflHS59uo5I5o2yxSNex7Q5rmnkOB9CD7hQFd9g2zu9U1TR1OgmOU8NWGiZlB51F1cen9w9nHH4Knuru2TWDZPfG6j6aZbqZnGh9Nz9pYzaMwuNuuWOQF3PmwiCUR1ETPXl8ZHSSHtHBmAbQUVN9KcD0C3RYxBkOn27PWe9UU7GyVFnbqJUQVVIQBzHUQN4laQePvEtJ4LSQQV7Mfhk7WqiCOnySizXI2MDWO+1Mvr3+YwcfI4RyMHSePQAfhwgn7LtZNIsAjmlznVHE8fbAeJPtO809MWnkjjh7weeQRx689lCN98SHapQ17rJiGV3rPrwASLdiNhq7jK/146XhjYnc8cdn/AJ8DuvdxHYBs1wmVs1l2+4xO5o4H2syW6D159Kt8o5/FTjYscx7FrdHaMYsVutFDEOI6WgpWU8LPyYwAD+SCqN01W3z6+0Elt0W0Rg0ZslaDGMp1AqWm6Rxn1dFbI2udFKB6eaHNJ9x6jI9vOwLR7RK6nUHKXVGo+pdVUOrazLsib503xLiCX08Li5sJ5HIfy6X5nfrOCGiziICIiAiIgIiICIiAiIgIiICIiAqz+I9qBadPtnGoc1yrmQVF/oRj9BGXEOqJ6pwYWN+pEXnPI/djcrLPeyNjpJHBrWglzieAB9StXmWTVfid7yqfDrTNK7QvR2dz6+rieDDdqjr4cWkHh3nuj8uMgniBj5BwX9JC3nh54hWYPsx0sstfTmGee0SXUtd69NbUy1bCfzZO38vRWJXHT09PR08VJSQRwQQMbHFFG0NYxgHAa0DsAAOAAuRAREQEREBERAREQEREBERAREQEREBERB52RY7YctsVfjGUWekutpukD6WtoquJssNRE8cOY9juxBCoretLNePDxrbnnW3emrdRtD5JXV96wKrnc+vsTS4mSegk4c5zG88u4Dj0gmRrukzNv2iCPNDde9LtxWD0+faV5JFc6CThlTA7hlVQTccmCoi5JjkH07gj5mlzSHGQ1Q7cXs51L0iz6o3VbFagWfLGOdUZHhrAPgL7FzzJ5UHIaXH5i6LkdRPVEWSgdcubRd8On+6Cinxqso5MS1Gs7Sy8YvXksma9nIkfT9QDpGAg9TSA9no4ejnBZVERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQF+EBwLXAEEcEH3X6iCu9bsK24nWbH9d8YxisxHKLDcftM/o9V/B0tfL3JbUQBpZ0kuPUI/LL+SHFwJCsQiICIiAiIgIiICIiAiIgIiICIiAiIgIipvuE3Q53qfltZtZ2Wlt4zmXiDJsvid/uZiNO5xbIXTjkGpADhw0OLSCGh0o6WBg2+jcvmOquVSbF9qjH3nNcgLqLLLnSvIgtNH286ndMOzD0nid3cMaTGOZHFrbSbWttuG7WtI7bpnigFTUN/td4ujo+mS5V7mgSTOHJ6W9g1jOT0sa0ck8uPmbWNpOnG1bEZLVjDZLtkt1DZcgyWtbzWXSfkuJPJPlxhzndMYJ49XFziXGcEBERAREQEREBERAREQEREBERAREQEREBERAREQFTnfBsksuqVurte9HzW4xrHitM+6W6vszXNlu8lO0vbBIxnd07g3ojkHzclrXdTeALjIg18bR/Ewkut0o9Et4VqmwXPWMhjprxcqN1BTXHraDH8TG8N+Fle0tcHcCJ/Pby+WtOwYEOAc0ggjkEe6gDdnst0m3bYyKTLKX7JyihhMdoyWjiaaql7kiOQdhPB1EkxuPbqcWFjiXKi2ne4jc34Z2W0OjG5qxVuW6WTSPis13pCZnQwt96GZ5aHsaC3qpZS1zAR0lg++G2lFiGmGrumetGMxZhpZmlsyO0yngzUcvLo3ckdMkbgHxO7H5XtaffhZegIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgLyMsy7F8Ex+tyvNMht9ks1ujMtVXV9Q2GGJv1c5xA7+gHqSQB3UCas7ybZbsrn0Z27YvLqvqj0lr7fbJAbXZTz0+bcqwHoha13qwHq5HSeguBWN4/smv8Aqtf6PUXezqG7Ui70rhNQ4jbw6kxa0u5J6WU44dVOHIHXLwXAcPDxwUGE5HrJrjvwuVRp3tijueC6P+c6lv2plXC+CpucTTxJBbIzw/h3cF/Y/vGP7r7VaG6D6ZbdcDpNO9LbAy3W6DiSeZ5D6mun4AdPUScAySO49eAAOGtDWgNGc22226z0FParRQU1DRUkTYaempomxRQxtHDWMY0ANaB2AA4C7KAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgLHs80+wrU/GKzDNQMbor5Za9pbPSVbOpruxHII4LXcE/M0gjk91kKINUWvvhta17ectdrLsWyi/CKEeZLY6WtLLhSNBaSyN7ncVkRPJ8p4Lvl44kJCmDZL4k0mpV6j0V3P08OJ6iy1kdDaJ30EtJFdpXuLBBJGQRBU9Y6QD0seSGtAd8pv6sTy7SfTTPr/AI5lWZ4PZrxecRrRcbHX1dK189BUAHh8b/UcHh3T93rZG/jqYxzQyxERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBEXDV1dLQUstbXVMVPTwMMks0rwxkbAOS5zj2AA9yg5kVdMg3r4TdLvV4ht6xC/a05LSkxyx4uxotNLJ24FTdJOKaMHn1a6Q/gvFk0K3Pa8DztxOs/6D43OAXYXpvK+ndI3v8lXdZB50nIPD44g1hHIB90GaavbyND9Ibs3D5r1V5dmsxdHTYjidMbrd5ZA3nodDEeIjx3/AFrmdu45UaT4Lu73VvH9KF5l0I01qB82NWCtbUZLdIj6sqq1o6KVj2nuyMF3cte0+qn7SbQbR7Qu0GzaT6e2fHIXtDZpqaDqqanvzzNUP5lmPPu9zlnyDCtJtGNL9DMViwvSjDLdjtqjIc+OmZzJUPA48yaV3L5n8ADre5x4HHKzVEQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERARYhqHrBpXpJb/tPU3UPHsYpy3rYbncIoHyjv8A3bHHqkPY9mgnsolk3b3bNQYNvG3/AD7UPrb1Q3etpP0dsbx6dQrK8MfIB/qoX8jnjntyFiVg2qOuOkWiltbddVNQrLjcUjS6GOsqB8RUcc9oYG8yzHsezGuP4KJ36W7vdViHao652nTWzSEeZZNOKMyVz4z+y+61gLmPHpzDC0fQ9uTmml21DQfSS5nJccwaCvyeRwknyW+TPul3mk93mrqC+RpPbkMLR2HZBgLtxWv2sThS7aNA6qgtEwHTmmo4ktVv6SORJT0Df7ZUtI7tdxGORweAQVy0mzJuf1cV93U6sZFqzWNe2Vtje42rGqZ4PLfLt1OQJS37vVM+TqAHI55VlkQedj+OY9idop8fxWxW6zWujZ0U9Fb6VlPTwt+jI2ANaPwAXooiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAi4K2uorbSS19xrIKWmgb1yzTyBkbG/Vzj2A/NRxVbk9HPOlpMcyp+X1kLzHJS4jQVF+kjf+7J8EyVsR+pkLQPchBJyKLBqTq/kXU3CtBKyhj/ydZmV8prZDIP3mx0grKj/kyRRkn6Dhy+/0R18yHvkOsFnxqB/cQYpjrHVMX4GquD6iOT8D8Kz8iglBRxlO4fSHFblNj8mWtvN+hHz2THaWa83Jp78B1NRskkj5LXAF7Wt7HuODxxs2/YPWhrszuWUZk/8AbbkF+qailkPfu6ia5lJzw4jtCO3ZZzj2NY5iVriseKY/bbLboBxFR2+kjpoGdgPlZGA0dgB2HsEEVyalbgcx4Zp1oPFjtLICW3TPbxFSkN47OZQ0XxEzu/7Mr4D278dl0pNCdX836n6ublcj+HkPU60YLSR45SNBIPR8QDNXOHtyKhhP0HopzRBGGA7ZNBNM68XrEdLrJFeeep15rYjX3N7vq6sqTJOSfxepPREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBF4Oc0ua1uJ3Km06u1qtmRyRAW+rutI+qpIpOocmSJj2OcC3qHZw4JB78cGEJch3/4uXT3DTnRbO4GkkRWS+XCy1DwHenTVRzxtJbx/lDwefb1CxqKuB3Qa142HHUbZHqdSgEAPxe4WzIGu7kcgRzxv49D3aDwe4HCf17tLaDgZfpvrHijuwIvGnlzZwSTwP1cbx6Dnt7eiCx6KubvEL2hQtkfXarz28QvDH/H41dqQhx7gcTUrVkll3pbSr/2oNxun0Z4PasvsFITwQPSZzO/f09/4IJoRYRRa5aJ3J5jt2sOEVT2jktgyCkeR/ASLuf0taVdQb/SZinJHIH2zTc8f8/8AFBlaLxKTOMKr4RUUOYWSoiJ4D4rhE9p/iHcLm/SzFv8AhLav+mR/96D1UXlfpZi3/CW1f9Mj/wC9fL8uxONjpJMntLWtBLnGtiAA+p+ZB66LGajU/TSkcGVWoeMwuJIAku1O08j19Xri/pY0s/zl4r/1zTf+NBlaLB6vXTRKgIbXaxYPTk+glyGkZz2595Pouv8A1hNAv8+Gn/8A2mov/MQSAiix263a42QxO3J6WB4PSWnMbdyD9OPO9V9f1o9uzpvh4tZcUmkJ4aILiyXrP+j0k9X8OUEooosZuc0Uma80eU1tY5g5dHSWK4VEnH16I4HO/wAEO5PTQ+W6nteotWyQctko9NMkqY/Uju+Ohc0dwfUoJTRRcNf7NMJRQ6aaoVL4z2b+hdfB1j6tM7GN/mUGt94mEb6DQLVGqZKeA77PoafpPPHds9XG4fnxwglFFF51a1Hk8xlPte1FY9n3HVN0xxkb/wCLLo9w/i1H6jazSsifR7dbgwv++2sya3RuZ/8ATfID/A/X+ISgijF+XbhJKnyqPRPFWxOHyy1ecPj4PH7QjoJCB+XUvg3rc9OwAabaXULw/uf03uFWHN/L7Ji4P80Eooot+D3QVvynIdLbNyXfN9jXG58dvlPT8VTc8H1HI5/D0P23A9crhyb3r7T0ZJ5/9XsRpqUDuDwPjJavt2cO/PYj3HJCT0UXDQuprW9OU63ao33n7xN7itRd6f8AuuCl49P2ePUr6Ztp0WkHF7xCbJfTn9J7tW30u44+98fNN1eg9eff6lBlWR6mab4fyMt1BxqycEg/aN2gpu4PB/vHj3B/ksVdub0Fka11p1MtV+Dh1N/R8SXfqHT1dvg2y89u/b6H6FZPjWlmmOGBgw/TnF7EIiCwW20U9L0kehHlsHHHCyhBGL9erTUl7Me011OvEjOflbhtbb+o9+wdcGU7fb1547jv3X5/SPrDc+W2LbtdaI88NdkmR22jYe57n4OSscB2B+7z8w7A8gSeiCLCzdBeo+DPpfh7nEc9MdwyItHHfgk2/k89gSOPfg/dX67SLPL0Acy3BZlO13V5tHYqahtFK4H2a5kL6tvHtxU8qUkQRpRbbtFoKmK4XfCIcmroDzFW5VVz36pjd+8yWvfM5h/4pHqQOykenp6ekgjpaSCOGGJoZHHG0Naxo9AAOwC5EQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQF59xx+w3gk3ayUFb1MLD8TTMk5afUfMD2/BegiDFP6JtK/8ANpin/U1N/wCBcc2j2kdS0sqNLcQlaQQQ+x0zhwfUd2LL0QYA/b7oJI4vfohgDnH1JxqiJ/8Axr8/q9aBf5jtP/8AszRf+WpARBH/APV60C/zHaf/APZmi/8ALXeptF9HaJoZR6T4bA0AACKxUrQOBwPRnsCVmSIMU/om0rPrpninb/4NTf8AgXbptPsCogBR4RYIOAAPKtsLeOPT0b7clZAiDyf0TxX/AIM2r/oUf/cuxSWKyW9/mUFmoaZ/IPVDTsYe3p3A/Fd5EBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQf//Z", + "identifier": false, + "tagName": "TANGY-SIGNATURE" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172025752, + "tagName": "TANGY-FORM-ITEM" + }, + { + "id": "item2", + "title": "Registration", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": false, + "inputs": [ + { + "name": "qr", + "value": "{ \"participant_id\": \"810004\" }", + "justFoundData": false, + "isScanning": false, + "notScanning": true, + "required": true, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "disabled": true, + "hidden": false, + "skipped": false, + "hintText": "", + "statusMessage": "", + "label": "Scan a new participant card", + "hideOutput": false, + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-QR" + }, + { + "name": "participant_id", + "private": false, + "label": "Participant ID", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "810004", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + }, + { + "name": "enrollment_date", + "private": false, + "label": "Enrollment Date", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "date", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "2020-12-16", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + }, + { + "name": "number_of_role_2_participants_to_enroll", + "private": false, + "label": "How many participant of type Role 2 would you like to enroll in this case?", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "number", + "required": true, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "0", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172051343, + "tagName": "TANGY-FORM-ITEM" + }, + { + "id": "item3", + "title": "Does not qualify", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": true, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": false, + "inputs": [], + "open": false, + "incomplete": true, + "disabled": true, + "hidden": true, + "locked": true, + "isDirty": false, + "tagName": "TANGY-FORM-ITEM" + }, + { + "id": "item4", + "title": "Conclude", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "conclusion_message", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "hintText": "", + "tagName": "TANGY-BOX", + "disabled": true + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172118410, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 3, + "nextFocusIndex": -1, + "previousFocusIndex": 1, + "startDatetime": "12/16/2020, 8:27:05 PM", + "startUnixtime": 1608172025751, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172120131, + "previousItemId": "item2", + "progress": 0, + "endUnixtime": 1608172120133, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "93250c56-9f60-4e3d-a5de-a92df4a3080e", + "eventFormId": "c35d8155-987f-442f-bdc7-b284f081fc95", + "participantId": "", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172121638, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172121638, + "_id": "bf795dd2-5eac-43da-8584-706f60242d27", + "_rev": "8-8308111abda32279189e8fc98d12d6b2" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Test Form", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "test-form", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "test", + "private": false, + "label": "Test Form", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "whamp whamp", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172139975, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:28:59 PM", + "startUnixtime": 1608172139974, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172148967, + "endUnixtime": 1608172148976, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "4682fdbb-d55c-44b5-bb64-470e1a220333", + "eventFormId": "4572b0e5-6557-4503-9387-f004ddd28a2a", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172149653, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172149653, + "_id": "54cb2456-16bd-4ae1-9ad1-a3a4fb24a600", + "_rev": "4-12598c712f92f0513df122833430d133" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Mark Skipped Inputs inside a Section", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "skip-section", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item-200", + "title": "Pre Observation", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": false, + "inputs": [ + { + "hideButtons": false, + "hideHelpText": false, + "name": "pre_1", + "value": [ + { + "hideButton": false, + "name": "1", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "2", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "", + "required": true, + "label": "What class are you observing?", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "id": "pre_1", + "tagName": "TANGY-RADIO-BUTTONS" + }, + { + "hideButtons": false, + "hideHelpText": false, + "name": "pre_2", + "value": [ + { + "hideButton": false, + "name": "1", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "2", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "", + "required": false, + "label": "Lesson/learning area to be observed", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "id": "pre_2", + "tagName": "TANGY-RADIO-BUTTONS" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172165456, + "tagName": "TANGY-FORM-ITEM" + }, + { + "id": "item-500", + "title": "Literacy 1, Primary 1, Day 1&3", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": false, + "inputs": [ + { + "hideButtons": false, + "hideHelpText": false, + "name": "P1L1D12A", + "value": [ + { + "hideButton": false, + "name": "1", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "0", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "", + "required": true, + "label": "2.a) Does the teacher say the name and sound of letter(s) being taught ", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "id": "P1L1D12A", + "tagName": "TANGY-RADIO-BUTTONS" + }, + { + "hideButtons": false, + "hideHelpText": false, + "name": "P1L1D12B", + "value": [ + { + "hideButton": false, + "name": "1", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "0", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "", + "required": true, + "label": "2.b) Does the teacher quack like a duck? ", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "id": "P1L1D12B", + "tagName": "TANGY-RADIO-BUTTONS" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172178176, + "tagName": "TANGY-FORM-ITEM" + }, + { + "id": "item4", + "title": "Conclude", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "conclusion_message", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "hintText": "", + "tagName": "TANGY-BOX", + "disabled": true + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172183378, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 2, + "nextFocusIndex": -1, + "previousFocusIndex": 1, + "startDatetime": "12/16/2020, 8:29:25 PM", + "startUnixtime": 1608172165456, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172184765, + "previousItemId": "item-500", + "progress": 0, + "endUnixtime": 1608172184767, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "257bc9fd-6f58-4aa6-9d00-73df0f0c8e46", + "eventFormId": "7a3cfb27-15fc-4e10-a501-328fb3b23896", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172185354, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172185354, + "_id": "5ed2d12b-6f1b-4441-afa8-80c98ded5fb5", + "_rev": "8-c5f5af359a47a31091c3a10329544eb3" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Test Form", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "test-form", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "test", + "private": false, + "label": "Test Form", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "blurb", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172228868, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:30:28 PM", + "startUnixtime": 1608172228868, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172237935, + "endUnixtime": 1608172237944, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "16fe2f63-6578-4613-9cbd-f36dcdb2384b", + "eventFormId": "aac38b6a-b1a8-48ef-bfba-117673ae92cf", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172238620, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172238620, + "_id": "00b1c24e-1459-4533-bb37-6222a3bae234", + "_rev": "4-7dbcfcccc2d1ad213225196c09036622" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Template Event Listing", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "template-event-listing", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item-1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "title", + "private": false, + "label": "Set the custom title for this event.", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "text", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "rock-n-roll", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172274609, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:31:14 PM", + "startUnixtime": 1608172274609, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172282103, + "endUnixtime": 1608172282113, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "e3158705-fa46-4c6b-a4ab-17842b082a7e", + "eventFormId": "0004a86d-f2b2-4ffe-a319-dace217bf205", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172282705, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172282705, + "_id": "400e3cdb-2ceb-4b1f-9818-0749365dd6c7", + "_rev": "4-409ed29216a5f8b8ba550a06a9c06a97" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Template Event Form Listing", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "template-event-form-listing", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item-1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "title", + "private": false, + "label": "Set the custom title for this Event Form.", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "text", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "almightie frumpus", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172309970, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:31:49 PM", + "startUnixtime": 1608172309970, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172324449, + "endUnixtime": 1608172324458, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "7001b2d9-884b-444c-842e-7d6a433bb396", + "eventFormId": "8612aa12-dc09-45be-80d0-0e1a87ee9f1b", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172325136, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172325136, + "_id": "a9c3c624-9db0-476b-a781-90b95d548277", + "_rev": "4-d9ba4e6075e8603eff2668e44b631aef" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Mark a Form as required example: form 1", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "mark-form-as-required-example--form-1", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item-1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "hideButtons": false, + "hideHelpText": false, + "name": "likes_fruit", + "value": [ + { + "hideButton": false, + "name": "no", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + }, + { + "hideButton": false, + "name": "yes", + "label": "", + "required": false, + "disabled": false, + "invalid": false, + "incomplete": true, + "hintText": "", + "hidden": false, + "skipped": false, + "value": "on", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTON" + } + ], + "hintText": "Answer yes to fill out another form about your favorite fruit.", + "required": false, + "label": "Do you like fruit?", + "disabled": true, + "hasWarning": false, + "hasDiscrepancy": false, + "hidden": false, + "skipped": false, + "invalid": false, + "incomplete": true, + "columns": 0, + "noMargin": false, + "questionNumber": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-RADIO-BUTTONS" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172351684, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:32:31 PM", + "startUnixtime": 1608172351684, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172355141, + "endUnixtime": 1608172355143, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "c31189f2-f29d-49c8-bde1-b0a34ca6378d", + "eventFormId": "f3bbc322-59ba-4c83-8391-c5f7f9239dd3", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172355728, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172355728, + "_id": "aa80b05b-843b-486c-8c95-9ede1ea4c43e", + "_rev": "4-b95610230c9c7537062fb0690e2bdd02" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Mark a Form as required example: form 2", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "mark-form-as-required-example--form-2", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item-1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "favorite_fruits", + "value": [ + { + "name": "apple", + "value": "" + }, + { + "name": "tangerine", + "value": "on" + }, + { + "name": "kiwi", + "value": "" + }, + { + "name": "Tomato", + "value": "" + } + ], + "hintText": "", + "atLeast": 0, + "required": false, + "skipped": false, + "disabled": true, + "label": "What are your favorite fruits?", + "hidden": false, + "incomplete": true, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "errorText": "", + "warnText": "", + "discrepancyText": "", + "questionNumber": "", + "identifier": false, + "tagName": "TANGY-CHECKBOXES" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172358064, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:32:38 PM", + "startUnixtime": 1608172358064, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172361397, + "endUnixtime": 1608172361399, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "c31189f2-f29d-49c8-bde1-b0a34ca6378d", + "eventFormId": "708aefe4-4760-4b9d-aac3-a4fdaa130de9", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172361993, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172361993, + "_id": "94aae64c-c24e-4e28-a596-5b2618b04e91", + "_rev": "4-05fbf3dfa5c727037fbc2d155ddeadf8" + }, + { + "collection": "TangyFormResponse", + "form": { + "fullscreen": false, + "title": "Test Form", + "complete": true, + "linearMode": false, + "hideClosedItems": false, + "hideCompleteFab": false, + "tabIndex": 0, + "showResponse": false, + "showSummary": false, + "hasSummary": false, + "fullScreenGranted": false, + "recordItemFirstOpenTimes": false, + "id": "test-form", + "tagName": "TANGY-FORM", + "fullscreenEnabled": false + }, + "items": [ + { + "id": "item1", + "title": "", + "summary": false, + "fullscreen": false, + "fullscreenEnabled": false, + "hideButtons": false, + "hideBackButton": true, + "hideNavIcons": false, + "hideNavLabels": false, + "rightToLeft": false, + "hideNextButton": true, + "showCompleteButton": true, + "inputs": [ + { + "name": "test", + "private": false, + "label": "Test Form", + "innerLabel": "", + "placeholder": "", + "hintText": "", + "type": "", + "required": false, + "disabled": true, + "hidden": false, + "skipped": false, + "invalid": false, + "hasWarning": false, + "hasDiscrepancy": false, + "incomplete": true, + "value": "pew pew pew", + "min": "", + "max": "", + "questionNumber": "", + "errorText": "", + "allowedPattern": "", + "errorMessage": "", + "warnText": "", + "discrepancyText": "", + "identifier": false, + "tagName": "TANGY-INPUT" + } + ], + "open": false, + "incomplete": false, + "disabled": false, + "hidden": false, + "locked": true, + "isDirty": false, + "firstOpenTime": 1608172384447, + "tagName": "TANGY-FORM-ITEM" + } + ], + "complete": true, + "hasUnlocked": false, + "focusIndex": 0, + "nextFocusIndex": 1, + "previousFocusIndex": -1, + "startDatetime": "12/16/2020, 8:33:04 PM", + "startUnixtime": 1608172384447, + "uploadDatetime": "", + "location": { + "region": "B7BzlR6h", + "district": "rrCuQT12", + "facility": "RJghrv5d" + }, + "type": "response", + "lastSaveUnixtime": 1608172391852, + "endUnixtime": 1608172391861, + "caseId": "f380a1de-44ba-41a8-96c7-c63c288554ab", + "eventId": "373b07f4-e4f0-4555-a282-2ff3f7f49441", + "eventFormId": "b83f5830-5d6d-4fb6-8da0-56389d61133d", + "participantId": "facaf3e3-2085-46b7-b230-b4cc5d3749c7", + "tangerineModifiedByUserId": "39c6630e-54b8-40ab-b3de-1ace91ebca90", + "tangerineModifiedByDeviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "tangerineModifiedOn": 1608172392448, + "buildId": "1eda1ec4-5856-4877-bfbc-2b49eae6a193", + "deviceId": "46a3815f-a1a8-4030-9374-ca614f14a6a0", + "groupId": "group-f5fcb57e-519e-48af-861e-6197ee1c88c4", + "buildChannel": "test", + "lastModified": 1608172392448, + "_id": "2a6e4fb1-8819-4cd7-87cb-7a6fdc00342d", + "_rev": "4-88f215a459a7deaa8aea954156cc027f" + } +] diff --git a/content-sets/teach/client/case-type-1-manifest/form.html b/content-sets/teach/client/case-type-1-manifest/form.html new file mode 100644 index 0000000000..a47ff9c53f --- /dev/null +++ b/content-sets/teach/client/case-type-1-manifest/form.html @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/content-sets/teach/client/case-type-1.json b/content-sets/teach/client/case-type-1.json new file mode 100644 index 0000000000..e515ce6701 --- /dev/null +++ b/content-sets/teach/client/case-type-1.json @@ -0,0 +1,542 @@ +{ + "id": "case-type-1", + "formId": "case-type-1-manifest", + "name": "Case Type 1", + "description": "This is Case Type 1.", + "caseRoles": [ + { + "id": "role-1", + "label": "Role 1", + "templateListItem": "Forms for ${participant.data.first_name} ${participant.data.last_name}, Role 1 Participant, ${participant.data.participant_id}" + }, + { + "id": "role-2", + "label": "Role 2", + "templateListItem": "Forms for ${participant.data.first_name ? `${participant.data.first_name} ${participant.data.last_name}, `:''} Role 2 Participant, ${participant.data.participant_id}" + } + ], + "templateCaseTitle": "${getVariable('participant_id') ? `${getVariable('first_name')} ${getVariable('last_name')}` : '...'}", + "templateCaseDescription": "${getVariable('participant_id') ? `Participant ID: ${getVariable('participant_id')}     Location: ${getVariable('location')}` : '...'}", + "templateCaseEventListItemIcon": "${caseEvent.complete ? 'event_available' : 'event_note'}", + "templateCaseEventListItemPrimary": "${T.case.getVariable(`${caseEvent.id}-title`) ? T.case.getVariable(`${caseEvent.id}-title`) : caseEventDefinition.name}", + "templateCaseEventListItemSecondary": "${caseEvent.scheduledDay ? `Scheduled: ${moment(caseEvent.scheduledDay, 'YYYY-MM-DD').format('DD/MM/YYYY')}, ` : ''} Status: ${caseEvent.complete ? 'Complete' : 'Incomplete'}", + "templateEventFormListItemIcon": "", + "templateEventFormListItemPrimary": "${eventForm?.data?.title ? eventForm.data.title : eventFormDefinition.name}", + "templateEventFormListItemSecondary": "Status: ${!eventForm.complete ? 'Incomplete' : 'Complete'}", + "templateBreadcrumbText": "${caseService.getVariable('participant_id') ? ` ${caseService.getVariable('participant_id')}` : ` ${caseService.case._id.substring(0,6)}`}", + "startFormOnOpen": { + "eventId": "event-type-1", + "eventFormId": "event-form-definition-rce86e" + }, + "eventDefinitions": [ + { + "id": "event-type-1", + "name": "Registration", + "repeatable": false, + "required": true, + "eventFormDefinitions": [ + { + "id": "event-form-definition-rce86e", + "formId": "registration-role-1", + "forCaseRole": "", + "name": "Registration for Role 1", + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-ia3uo8", + "formId": "registration-role-2", + "forCaseRole": "role-2", + "name": "Registration for Role 2", + "autoPopulate": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-naeu32", + "formId": "test-issues-created-programatically-on-client", + "forCaseRole": "role-2", + "name": "Data Collector causes Issue to be created due to use of API in the form", + "autoPopulate": true, + "required": true, + "repeatable": true + }, + { + "id": "event-form-definition-vwgpn6", + "formId": "test-issues-created-on-client", + "forCaseRole": "role-2", + "name": "Data Collector causes Issue to be created due to `discrepancy-if` logic in form", + "autoPopulate": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-fin2z8", + "formId": "create-an-urgent-notification", + "forCaseRole": "role-2", + "name": "Data Collector causes an urgent notification to be created", + "autoPopulate": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-fdkai3", + "formId": "resolve-an-urgent-notification", + "forCaseRole": "role-2", + "name": "Data Collector resolves urgent notification", + "required": false, + "repeatable": true + }, + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Example of an Event Form that DOES NOT auto-populate when a participant is added or the event is created.", + "autoPopulate": false, + "required": false, + "repeatable": false + }, + { + "id": "event-form-definition-aieb38", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Example of an Event Form that DOES auto-populate when a participant is added or the event is created.", + "autoPopulate": true, + "required": false, + "repeatable": false + }, + { + "id": "event-form-definition-81a9b92", + "formId": "dynamically-make-an-optional-form-required", + "forCaseRole": "role-2", + "name": "Dynamically make an optional form required", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": false + }, + { + "id": "event-form-definition-a6haeb", + "formId": "form-that-syncs-up-but-not-down", + "forCaseRole": "role-2", + "name": "A form that syncs up but not down", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": false + }, + { + "id": "event-form-definition-bvye73g", + "formId": "form-with-alternative-template", + "forCaseRole": "role-2", + "name": "A form with an alternative template", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": true + } + ] + }, + { + "id": "admin-create-read", + "name": "Admin can create and read, Data Collector has no permission", + "permissions": { + "create": ["admin"], + "read": ["admin"] + }, + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Test form", + "autoPopulate": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "admin-create-read--dataCollector-read", + "name": "Admin can create and read, Data Collector can read.", + "permissions": { + "create": ["admin"], + "read": ["dataCollector", "admin"] + }, + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Test form", + "autoPopulate": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "admin-create--dataCollector-read", + "name": "Admin can create, Data Collector can read.", + "permissions": { + "create": ["admin"], + "read": ["dataCollector"] + }, + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Test form", + "autoPopulate": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "no-one-create--everyone-read", + "name": "No one can create, everyone can read.", + "permissions": { + "create": [] + }, + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Test form", + "autoPopulate": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "event-with-device-user-role-based-access-to-event-forms", + "name": "Event with DeviceUser Role based access to EventForm(s)", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "admin-create-read-update-delete--data-collector-none", + "name": "Admin can create, read, update, and delete. Data Collector has no permission.", + "permissions": { + "create": ["admin"], + "read": ["admin"], + "update": ["admin"], + "delete": ["admin"] + }, + "formId": "test-form", + "forCaseRole": "role-2", + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "autoPopulate": false, + "required": true, + "repeatable": true + }, + { + "id": "admin-create-read-update-delete--data-collector-update", + "name": "Admin can create, read, update, and delete. Data Collector can update.", + "permissions": { + "create": ["admin"], + "read": ["admin"], + "update": ["admin", "dataCollector"], + "delete": ["admin"] + }, + "formId": "test-form", + "forCaseRole": "role-2", + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "autoPopulate": false, + "required": true, + "repeatable": true + }, + { + "id": "no-one-create--everyone-read-update-delete", + "name": "No one can create. Everyone can read, update, and delete.", + "permissions": { + "create": [] + }, + "formId": "test-form", + "forCaseRole": "role-2", + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "autoPopulate": false, + "required": true, + "repeatable": true + }, + { + "id": "everyone-create-read-update--admin-delete", + "name": "Everyone can create, read, and update. Admin can delete.", + "permissions": { + "delete": ["admin"] + }, + "formId": "test-form", + "forCaseRole": "role-2", + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "autoPopulate": false, + "required": true, + "repeatable": true + } + ] + }, + { + "id": "another-event-with-role-2-forms", + "name": "Another event with role 2 forms", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-abxo39", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Example of an Event Form that DOES NOT auto-populate when a participant is added or the event is created.", + "autoPopulate": false, + "required": false, + "repeatable": false + }, + { + "id": "event-form-definition-aieb38", + "formId": "test-form", + "forCaseRole": "role-2", + "name": "Example of an Event Form that DOES auto-populate when a participant is added or the event is created.", + "autoPopulate": true, + "required": false, + "repeatable": false + } + ] + }, + { + "id": "change-location-of-case", + "name": "Change location of case", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-zibe83", + "formId": "change-location-of-case", + "forCaseRole": "role-1", + "name": "Change location of case", + "required": true, + "repeatable": false + } + ] + }, + { + "id": "template-event-listing", + "name": "Template Event listing", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-3f8fsg", + "formId": "template-event-listing", + "forCaseRole": "role-1", + "name": "Template event listing", + "required": true, + "repeatable": false + } + ] + }, + { + "id": "template-event-form-listing", + "name": "Template Event Form listing", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-Id20b2k", + "formId": "template-event-form-listing", + "forCaseRole": "role-1", + "name": "Template Event Form listing", + "required": true, + "repeatable": false + } + ] + }, + { + "id": "event-with-an-event-form-you-can-delete", + "name": "An Event with an Event Form you can delete", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-zafbe02", + "formId": "test-form", + "forCaseRole": "role-1", + "name": "An Event Form you can delete", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": false + } + ] + }, + { + "id": "test-event-completion-logic", + "name": "Test the Event completion logic", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-definition-zafbe02", + "formId": "test-form", + "forCaseRole": "role-1", + "name": "An Event Form required in the EventFormDefinition", + "autoPopulate": false, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-81b9i90", + "formId": "dynamically-make-an-optional-form-required", + "forCaseRole": "role-1", + "name": "Dynamically make an optional form required", + "autoPopulate": false, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": false + } + ] + }, + { + "id": "form-workflow-example", + "name": "Form Workflow Example", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form--workflow-form-1", + "formId": "workflow-form-1", + "forCaseRole": "role-1", + "name": "First form in a workflow", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form--workflow-form-2", + "formId": "workflow-form-2", + "forCaseRole": "role-1", + "name": "Second form in a workflow", + "autoPopulate": false, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form--workflow-form-3", + "formId": "workflow-form-3", + "forCaseRole": "role-1", + "name": "Third form in a workflow", + "autoPopulate": false, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "mark-form-as-required-example", + "name": "Mark a form as required example", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form--mark-form-as-required-example-1", + "formId": "mark-form-as-required-example--form-1", + "forCaseRole": "role-1", + "name": "Form 1", + "autoPopulate": true, + "required": true, + "repeatable": false + }, + { + "id": "event-form--mark-form-as-required-example-2", + "formId": "mark-form-as-required-example--form-2", + "forCaseRole": "role-1", + "name": "Form 2", + "autoPopulate": false, + "required": false, + "repeatable": false + } + ] + }, + { + "id": "kitchen-sink-form-example", + "name": "Kitchen Sink Form Example", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form--kitchen-sink-form", + "formId": "kitchen-sink-form", + "forCaseRole": "role-1", + "name": "Kitchen Sink Form Example", + "autoPopulate": true, + "required": true, + "repeatable": true + } + ] + }, + { + "id": "event-with-transfer-participant-feature", + "name": "An Event demonstrating Participant Transfer", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-participant-transfer", + "formId": "transfer-participant", + "forCaseRole": "role-1", + "name": "A form demonstrating the Participant Transfer feature.", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": false + } + ] + }, + { + "id": "event-with-skip-section-feature", + "name": "An Event that marks Skipped Inputs inside a Section", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "event-form-skip-section", + "formId": "skip-section", + "forCaseRole": "role-1", + "name": "A form that marks Skipped Inputs inside a Section.", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": true + } + ] + } + ] +} diff --git a/content-sets/teach/client/case-type-2-manifest/form.html b/content-sets/teach/client/case-type-2-manifest/form.html new file mode 100644 index 0000000000..83aa05a175 --- /dev/null +++ b/content-sets/teach/client/case-type-2-manifest/form.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/content-sets/teach/client/case-type-2.json b/content-sets/teach/client/case-type-2.json new file mode 100644 index 0000000000..62990b93d7 --- /dev/null +++ b/content-sets/teach/client/case-type-2.json @@ -0,0 +1,77 @@ +{ + "id": "case-type-2", + "formId": "case-type-2-manifest", + "name": "Case Type 2", + "description": "This is Case Type 2.", + "caseRoles": [ + { + "id": "role-1", + "label": "Role 1", + "templateListItem": "Forms for ${participant.data.first_name} ${participant.data.last_name}, Role 1 Participant, ${participant.data.participant_id}" + }, + { + "id": "role-2", + "label": "Role 2", + "templateListItem": "Forms for ${participant.data.first_name ? `${participant.data.first_name} ${participant.data.last_name}, `:''} Role 2 Participant, ${participant.data.participant_id}" + } + ], + "templateCaseTitle": "${getVariable('participant_id') ? `${getVariable('first_name')} ${getVariable('last_name')}` : '...'}", + "templateCaseDescription": "${getVariable('participant_id') ? `Participant ID: ${getVariable('participant_id')}     Location: ${getVariable('location')}` : '...'}", + "templateCaseEventListItemIcon": "${caseEvent.complete ? 'event_available' : 'event_note'}", + "templateCaseEventListItemPrimary": "${T.case.getVariable(`${caseEvent.id}-title`) ? T.case.getVariable(`${caseEvent.id}-title`) : caseEventDefinition.name}", + "templateCaseEventListItemSecondary": "${caseEvent.scheduledDay ? `Scheduled: ${moment(caseEvent.scheduledDay, 'YYYY-MM-DD').format('DD/MM/YYYY')}, ` : ''} Status: ${caseEvent.complete ? 'Complete' : 'Incomplete'}", + "templateEventFormListItemIcon": "", + "templateEventFormListItemPrimary": "${eventForm?.data?.title ? eventForm.data.title : eventFormDefinition.name}", + "templateEventFormListItemSecondary": "Status: ${!eventForm.complete ? 'Incomplete' : 'Complete'}", + "templateBreadcrumbText": "${caseService.getVariable('participant_id') ? ` ${caseService.getVariable('participant_id')}` : ` ${caseService.case._id.substring(0,6)}`}", + "startFormOnOpen": { + "eventId": "event-type-a", + "eventFormId": "event-form-definition-1" + }, + "eventDefinitions": [ + { + "id": "event-type-a", + "name": "Registration", + "repeatable": false, + "required": true, + "eventFormDefinitions": [ + { + "id": "event-form-definition-1", + "formId": "registration-role-1", + "forCaseRole": "", + "name": "Registration for Role 1", + "required": true, + "repeatable": false + }, + { + "id": "event-form-definition-2", + "formId": "registration-role-2", + "forCaseRole": "role-2", + "name": "Registration for Role 2", + "autoPopulate": true, + "required": true, + "repeatable": false + } + ] + }, + { + "id": "event-type-b", + "name": "Another Event", + "repeatable": true, + "required": false, + "eventFormDefinitions": [ + { + "id": "change-location-of-case", + "formId": "change-location-of-case", + "forCaseRole": "role-1", + "name": "Change location of Case.", + "autoPopulate": true, + "allowDeleteIfFormNotCompleted": true, + "allowDeleteIfFormNotStarted": true, + "required": false, + "repeatable": true + } + ] + } + ] +} diff --git a/content-sets/teach/client/change-location-of-case/form.html b/content-sets/teach/client/change-location-of-case/form.html new file mode 100644 index 0000000000..6bce05d282 --- /dev/null +++ b/content-sets/teach/client/change-location-of-case/form.html @@ -0,0 +1,9 @@ + + + + + diff --git a/content-sets/teach/client/components/basic-setup.js b/content-sets/teach/client/components/basic-setup.js new file mode 100644 index 0000000000..484cfa879b --- /dev/null +++ b/content-sets/teach/client/components/basic-setup.js @@ -0,0 +1,18 @@ +// Create a class definition for your component and extend the LitElement base class +class BasicSetup extends LitElement { + // The render callback renders your element's template. This should be a pure function, + // it should always return the same template given the same properties. It should not perform + // any side effects such as setting properties or manipulating the DOM. See the updated + // or first-updated examples if you need side effects. + render() { + // Return the template using the html template tag. lit-html will parse the template and + // create the DOM elements + return html` +
Hello world!
+ `; + } +} + +// Register your element to custom elements registry, pass it a tag name and your class definition +// The element name must always contain at least one dash +customElements.define('basic-setup', BasicSetup); diff --git a/content-sets/teach/client/components/custom-app.js b/content-sets/teach/client/components/custom-app.js new file mode 100644 index 0000000000..7bcaaddd2e --- /dev/null +++ b/content-sets/teach/client/components/custom-app.js @@ -0,0 +1,37 @@ +import './home-component.js' +import './page-1.js' +import './page-2.js' + +class CustomApp extends LitElement { + + static get properties() { + return { route: { type: String } }; + } + + constructor() { + super() + window.customApp = this + this.route = '' + } + + render() { + return html` + ${this.route === '' ? html` + + `: ``} + ${this.route === 'page1' ? html` + + `: ``} + ${this.route === 'page2' ? html` + + `: ``} + ` + } + + open(route) { + this.route = route + } + +} + +customElements.define('custom-app', CustomApp) diff --git a/content-sets/teach/client/components/find-case.js b/content-sets/teach/client/components/find-case.js new file mode 100644 index 0000000000..45da5a2bca --- /dev/null +++ b/content-sets/teach/client/components/find-case.js @@ -0,0 +1,161 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' + +export const FORM_TYPES_INFO = [ + { + id: 'form', + newFormResponseLinkTemplate: '/tangy-forms-player/${formId}', + resumeFormResponseLinkTemplate: '/tangy-forms-player?formId=${formId}&responseId=${searchDoc._id}', + iconTemplate: '${searchDoc && searchDoc.variables.complete ? `assignment-turned-in` : `assignment`}' + }, + { + id: 'case', + newFormResponseLinkTemplate: '/case-new/${formId}', + resumeFormResponseLinkTemplate: '/case/${searchDoc._id}', + iconTemplate: '${searchDoc && searchDoc.variables.complete ? `folder-special` : `folder`}' + } +] + +export class FindCase extends LitElement { + + constructor() { + super() + this.onSearch$ = new Subject() + this.didSearch$ = new Subject() + this.searchReady$ = new Subject() + this.navigatingTo$ = new Subject() + this.searchDocs = [] + this.username = '' + this.formsInfo = [] + this.formTypesInfo = [] + this.showScan = false + this.value = { + caseId: '', + participantId: '' + } + } + + async connectedCallback() { + super.connectedCallback() + this.formsInfo = await T.tangyFormsInfo.getFormsInfo() + this.username = T.user.getCurrentUser() + this.formTypesInfo = FORM_TYPES_INFO + this.onSearch$ + .pipe(debounceTime(300)) + .subscribe((searchString) => { + //this.searchResults.nativeElement.innerHTML = 'Searching...' + this.onSearch(searchString) + }) + //this.searchResults.nativeElement.addEventListener('click', (event) => this.onSearchResultClick(event.target)) + this.searchReady$.next(true) + this.onSearch('') + } + + render() { + return html` + +
+ Loading... +
+ ` + } + + onSearchKeyUp(event) { + const searchString = event.target.value + if (searchString.length > 2) { + this.onSearch$.next(event.target.value) + } else if (searchString.length === 0) { + this.onSearch$.next('') + } else { + this.shadowRoot.querySelector('#search-results').innerHTML = ` + + ${t('Enter more than two characters...')} + + ` + } + } + + async onSearch(searchString) { + this.shadowRoot.querySelector('#search-results').innerHTML = "Loading..." + this.searchDocs = await T.search.search(this.username, searchString) + let searchResultsMarkup = `` + if (this.searchDocs.length === 0) { + searchResultsMarkup = ` + + ${t('No results.')} + + ` + } + for (const searchDoc of this.searchDocs) { + const formTypeInfo = this.formTypesInfo.find(formTypeInfo => formTypeInfo.id === searchDoc.formType) + const formInfo = this.formsInfo.find(formInfo => formInfo.id === searchDoc.formId) + const formId = formInfo.id + searchResultsMarkup += ` +
+ ${eval(`\`${formTypeInfo.iconTemplate}\``)} +
+
${eval(`\`${formInfo.searchSettings.primaryTemplate ? formInfo.searchSettings.primaryTemplate : searchDoc._id}\``)}
+
+ ${eval(`\`${formInfo.searchSettings.secondaryTemplate ? formInfo.searchSettings.secondaryTemplate : formInfo.title}\``)} +
+
+
+ ` + } + this.shadowRoot.querySelector('#search-results').innerHTML = searchResultsMarkup + this.shadowRoot.querySelectorAll('.search-result').forEach((element) => element.addEventListener('click', (event) => this.onSearchResultClick(event))) + this.didSearch$.next(true) + } + + scan() { + this.showScan = true + this.scanner.startScanning() + } + + onSearchResultClick(event) { + let element = event.currentTarget + let parentEl = undefined + let currentEl = element + while (!parentEl) { + if (currentEl.hasAttribute('case-id')) { + parentEl = currentEl + } else { + currentEl = currentEl.parentElement + } + } + this.value = currentEl.getAttribute('case-id') + this.dispatchEvent(new CustomEvent('case-selected')) + } + + focusOnFind() { + this + .searchBar + .nativeElement + .focus() + } + + goTo(url) { + this.navigatingTo$.next(url) + //this.router.navigateByUrl(url) + } + + onScanChange(scanSearchString) { + this.showScan = false + this.onSearch(scanSearchString) + //this.searchBar.nativeElement.value = scanSearchString + } + + onScanError() { + + } + + onScanCancel() { + this.showScan = false + + } +} + + +customElements.define('find-case', FindCase); diff --git a/content-sets/teach/client/components/find-participant-by-case.js b/content-sets/teach/client/components/find-participant-by-case.js new file mode 100644 index 0000000000..ee27ae3e06 --- /dev/null +++ b/content-sets/teach/client/components/find-participant-by-case.js @@ -0,0 +1,94 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html } from 'lit-element'; +import {unsafeHTML} from 'lit-html/directives/unsafe-html.js'; +import { t } from 'tangy-form/util/t.js' + +export class FindParticipantByCase extends LitElement { + + constructor() { + super() + this.value = { + caseId: '', + participantId: '' + } + } + + static get properties() { + return { + name: { type: String }, + value: { type: Object } + } + } + + async connectedCallback() { + super.connectedCallback() + } + + render() { + return html` + +
+ ${!this.value.caseId && !this.value.participantId ? html` + + `:``} + ${this.value.caseId && !this.value.participantId ? html` + ${t(`Now which participant.`)} + + `:``} + ${this.value.caseId && this.value.participantId ? html` +
+ ${t(`Selected Participant`)}: ${this.participantListing} +
+
+ ${t(`RESET`)} +
+ `:``} +
+ ` + } + + reset() { + this.value = {caseId: '', participantId: ''} + } + + onParticipantSelected(event) { + this.participantListing = unsafeHTML(event.detail.participant.listItem) + this.value = { + caseId: this.value.caseId, + participantId: event.target.value + } + this.dispatchEvent(new CustomEvent('change')) + } + + onCaseSelected(event) { + this.value = { + caseId: event.target.value, + participantId: '' + } + this.dispatchEvent(new CustomEvent('change')) + } + + validate() { + if (this.required) { + return this.value && this.value.caseId && this.value.participantId + ? true + : false + } else { + return true + } + } + +} + + +customElements.define('find-participant-by-case', FindParticipantByCase); diff --git a/content-sets/teach/client/components/find-participant-by-data-and-location.js b/content-sets/teach/client/components/find-participant-by-data-and-location.js new file mode 100644 index 0000000000..9a528583c2 --- /dev/null +++ b/content-sets/teach/client/components/find-participant-by-data-and-location.js @@ -0,0 +1,70 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html, unsafeHtml } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' + + +export class SelectParticipant extends LitElement { + + constructor() { + super() + this.value = '' + this.participants = [] + } + + static get properties() { + return { + name: { type: String }, + value: { type: String }, + caseId: { type: String }, + participants: { type: Array }, + ready: { type: Boolean } + } + } + + async connectedCallback() { + super.connectedCallback() + await T.caseDefinition.load() + const caseInstance = await T.tangyForms.getResponse(this.caseId) + const caseDefinitionFormId = caseInstance.form.id + const caseDefinition = T.caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + this.participants = caseInstance.participants.map(participant => { + let renderedListItem + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + eval(`renderedListItem = \`${roleDefinition.templateListItem}\``) + return { + id: participant.id, + listItem: renderedListItem + } + }) + this.ready = true + } + + onSubmit() { + debugger + } + + render() { + return html` + ${this.ready ? html` + + + ${t('SUBMIT')} +
    + ${this.participants.map(participant => html` +
  • ${participant.listItem}
  • + `)} +
+ `:``} + ` + } + + onParticipantSelect(participant) { + this.value = participant.id + this.dispatchEvent(new CustomEvent('participant-selected', { detail: { participant} })) + } + +} + + +customElements.define('find-participant-by-data-and-location', FindParticipantByLocationAndData); diff --git a/content-sets/teach/client/components/find-participant-by-location-and-data.js b/content-sets/teach/client/components/find-participant-by-location-and-data.js new file mode 100644 index 0000000000..7aa19162ed --- /dev/null +++ b/content-sets/teach/client/components/find-participant-by-location-and-data.js @@ -0,0 +1,160 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html, unsafeHtml } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' + + +export class FindParticipantByLocationAndData extends LitElement { + + constructor() { + super() + this.value = { + participantId: '', + caseId: '' + } + this.participantInfos = [] + this.selectedParticipantLabel = '' + this.participantIsSelected = false + } + + static get properties() { + return { + name: { type: String }, + value: { type: String }, + caseId: { type: String }, + participantInfos: { type: Array }, + ready: { type: Boolean }, + hasSearched: { type: Boolean }, + hidden: { type: Boolean }, + skipped: { type: Boolean } + } + } + + render() { + return html` + +
+ ${!this.participantIsSelected ? html` +

Participant Search

+
${t('Location')}:
+ +
${t('Name')}:
+ + ${t('SEARCH')} + ${this.hasSearched ? html` +
${t('Search Results')}:
+ ${this.participantInfos.length === 0 ? html` +
+ ${t('No matches found.')} +
+ `: html` +
    + ${this.participantInfos.map(participantInfo => html` +
  • ${participantInfo.renderedListItem}
  • + `)} +
+ `} + `:``} + `: html` +
+ ${t(`Selected Participant`)}: ${this.selectedParticipantLabel} +
+
+ ${t(`RESET`)} +
+ `} +
+ + ` + } + + async onSubmit() { + this.hasSearched = true + const locationKeys = this.shadowRoot.querySelector('[name="location"]').value.map(node => node.value) + const term = this.shadowRoot.querySelector('[name="term"]').value + const userDb = await T.user.getUserDatabase() + const options = { + startkey: [ T.case.case.form.id, ...locationKeys, term.toLocaleLowerCase() ].join(''), + endkey: `${[ T.case.case.form.id, ...locationKeys, term.toLocaleLowerCase() ].join('')}\uffff`, + limit: 25 + } + const results = await userDb.query('findParticipantByCaseFormIdAndLocationAndData', options) + const hits = results.rows + .map(result => result.value) + .reduce((acc, item) => { + return acc.find(i => i.participantId === item.participantId) + ? acc + : [ ...acc, item ] + }, []) + const participantInfos = [] + for (let hit of hits) { + await T.caseDefinition.load() + const caseInstance = await T.tangyForms.getResponse(hit.caseId) + const caseDefinitionFormId = caseInstance.form.id + const caseDefinition = T.caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + const participant = caseInstance.participants.find(participant => participant.id === hit.participantId) + const data = participant.data + let renderedListItem + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + eval(`renderedListItem = \`${roleDefinition.templateListItem}\``) + participantInfos.push({ + renderedListItem, + ...hit + }) + } + this.participantInfos = participantInfos + } + + onParticipantSelect(participantInfo) { + this.value = { + participantId: participantInfo.participantId, + caseId: participantInfo.caseId + } + this.selectedParticipantLabel = participantInfo.renderedListItem + this.participantIsSelected = true + this.dispatchEvent(new CustomEvent('participant-selected', { detail: { participantInfo } })) + this.dispatchEvent(new CustomEvent('change')) + } + + reset() { + this.value = {caseId: '', participantId: ''} + this.participantIsSelected = false + this.hasSearched = false + this.dispatchEvent(new CustomEvent('change')) + } + +} + + +customElements.define('find-participant-by-location-and-data', FindParticipantByLocationAndData); diff --git a/content-sets/teach/client/components/find-participant.js b/content-sets/teach/client/components/find-participant.js new file mode 100644 index 0000000000..d385ef2ac0 --- /dev/null +++ b/content-sets/teach/client/components/find-participant.js @@ -0,0 +1,182 @@ +import { unsafeHTML } from 'lit-html/directives/unsafe-html'; +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html, customElement, property } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' + +export const FORM_TYPES_INFO = [ + { + id: 'form', + newFormResponseLinkTemplate: '/tangy-forms-player/${formId}', + resumeFormResponseLinkTemplate: '/tangy-forms-player?formId=${formId}&responseId=${searchDoc._id}', + iconTemplate: '${searchDoc && searchDoc.variables.complete ? `assignment-turned-in` : `assignment`}' + }, + { + id: 'case', + newFormResponseLinkTemplate: '/case-new/${formId}', + resumeFormResponseLinkTemplate: '/case/${searchDoc._id}', + iconTemplate: '${searchDoc && searchDoc.variables.complete ? `folder-special` : `folder`}' + } +] + +export class FindParticipant extends LitElement { + + constructor() { + this.onSearch$ = new Subject() + this.didSearch$ = new Subject() + this.searchReady$ = new Subject() + this.navigatingTo$ = new Subject() + this.selectedListItem = '' + this.selectedSearchDoc = undefined + this.searchDocs = [] + this.username = '' + this.formsInfo = [] + this.formTypesInfo = [] + this.showScan = false + this.value = { + caseId: '', + participantId: '' + } + this.required = false + } + + async connectedCallback() { + super.connectedCallback() + this.formsInfo = await window['T'].tangyFormsInfo.getFormsInfo() + this.username = window['T'].user.getCurrentUser() + this.formTypesInfo = FORM_TYPES_INFO + await window['T'].caseDefinition.load() + this.onSearch$ + .pipe(debounceTime(300)) + .subscribe((searchString) => { + this.onSearch(searchString) + }) + this.searchReady$.next(true) + } + + reset() { + this.selectedListItem = '' + this.value = { + caseId: '', + participantId: '' + } + } + + render() { + return html` + +
+ ${this.selectedListItem ? html` +
+ ${t('Selected Participant')}: +
+
+ ${unsafeHTML(this.selectedListItem)} +
+ ${t('RESET')} + `: html` + +
+
+ `} +
+ ` + } + + onSearchKeyUp(event) { + const searchString = event.target.value + if (searchString.length > 2) { + this.onSearch$.next(event.target.value) + } else if (searchString.length === 0) { + this.onSearch$.next('') + } else { + this.shadowRoot.querySelector('#search-results').innerHTML = ` + + ${t('Enter more than two characters...')} + + ` + } + } + + async onSearch(searchString) { + this.shadowRoot.querySelector('#search-results').innerHTML = "Loading..." + this.searchDocs = await window['T'].case.searchForParticipant(this.username, searchString) + let searchResultsMarkup = `` + if (this.searchDocs.length === 0) { + searchResultsMarkup = ` + + ${t('No results.')} + + ` + } + for (const searchDoc of this.searchDocs) { + const caseDefinitionFormId = searchDoc.case.form.id + const caseDefinition = window['T'].caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + const participant = searchDoc.participant + const caseInstance = searchDoc.case + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + let renderedListItem = '' + eval(`renderedListItem = \`${roleDefinition.templateListItem}\``) + searchResultsMarkup += ` +
+ person +
+
${renderedListItem}
+
+
+
+
+ ` + } + this.shadowRoot.querySelector('#search-results').innerHTML = searchResultsMarkup + this.shadowRoot.querySelectorAll('.search-result').forEach((element) => element.addEventListener('click', (event) => this.onSearchResultClick(event))) + this.didSearch$.next(true) + } + + onSearchResultClick(event) { + let element = event.currentTarget + let parentEl = undefined + let currentEl = element + while (!parentEl) { + if (currentEl.hasAttribute('participant-id')) { + parentEl = currentEl + } else { + currentEl = currentEl.parentElement + } + } + this.value = { + participantId: currentEl.getAttribute('participant-id'), + caseId: currentEl.getAttribute('case-id') + } + const searchDoc = this.searchDocs.find(s => s.participantId === this.value.participantId) + const caseDefinitionFormId = searchDoc.case.form.id + const caseDefinition = window['T'].caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + const participant = searchDoc.participant + const caseInstance = searchDoc.case + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + let renderedListItem = '' + eval(`renderedListItem = \`${roleDefinition.templateListItem}\``) + this.selectedListItem = renderedListItem + this.dispatchEvent(new CustomEvent('participant-selected')) + } + + validate() { + if (this.required) { + return this.value && this.value.caseId && this.value.participantId + ? true + : false + } else { + return true + } + } + +} diff --git a/content-sets/teach/client/components/home-component.js b/content-sets/teach/client/components/home-component.js new file mode 100644 index 0000000000..3d398c4778 --- /dev/null +++ b/content-sets/teach/client/components/home-component.js @@ -0,0 +1,21 @@ +class HomeComponent extends LitElement { + render() { + return html` +
    +
  • Go to Page 1
  • +
  • Go to Page 2
  • +
+ ` + } + + openPage1() { + window.customApp.open('page1') + } + + openPage2() { + window.customApp.open('page2') + } + +} + +customElements.define('home-component', HomeComponent) diff --git a/content-sets/teach/client/components/page-1.js b/content-sets/teach/client/components/page-1.js new file mode 100644 index 0000000000..9a30de3f4c --- /dev/null +++ b/content-sets/teach/client/components/page-1.js @@ -0,0 +1,26 @@ +class Page1 extends LitElement { + + render() { + return html` + + chevron_leftGo back +

+ This is page 1. +

+ ` + } + + goBack() { + window.customApp.open('') + } + +} + +customElements.define('page-1', Page1) diff --git a/content-sets/teach/client/components/page-2.js b/content-sets/teach/client/components/page-2.js new file mode 100644 index 0000000000..3ebab61793 --- /dev/null +++ b/content-sets/teach/client/components/page-2.js @@ -0,0 +1,26 @@ +class Page2 extends LitElement { + + render() { + return html` + + chevron_leftGo back +

+ This is page 2. +

+ ` + } + + goBack() { + window.customApp.open('') + } + +} + +customElements.define('page-2', Page2) diff --git a/content-sets/teach/client/components/select-participant.js b/content-sets/teach/client/components/select-participant.js new file mode 100644 index 0000000000..83747aba67 --- /dev/null +++ b/content-sets/teach/client/components/select-participant.js @@ -0,0 +1,80 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html, unsafeHtml } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' +import { combTranslations } from 'translation-web-component/util.js' + +export class SelectParticipant extends LitElement { + + constructor() { + super() + this.value = '' + this.participants = [] + } + + static get properties() { + return { + name: { type: String }, + value: { type: String }, + label: { type: String}, + caseId: { type: String }, + participants: { type: Array }, + ready: { type: Boolean } + } + } + + async connectedCallback() { + super.connectedCallback() + await T.caseDefinition.load() + const caseInstance = await T.tangyForms.getResponse(this.caseId) + const caseDefinitionFormId = caseInstance.form.id + const caseDefinition = T.caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + let householdParticipants = caseInstance.participants.filter(participant => + (participant.caseRoleId !== 'household-role') && + !participant.data.is_outmigrated && !participant.data.relocated && + participant.data.is_alive) + this.participants = householdParticipants.map(participant => { + let renderedListItem + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + eval(`renderedListItem = \`${combTranslations(roleDefinition.templateSearchItem)}\``) + return { + id: participant.id, + listItem: renderedListItem + } + }) + this.ready = true + } + + render() { + return html` +
+ ${this.ready ? + html` + ${this.participants.length > 0 ? + html` +

${combTranslations(this.label)}

+
    + ${this.participants.map(participant => + html` +
  • ${participant.listItem}
  • + `)} +
+ ` : + html` +
+

${t(`No participants found in the case.`)}

+
+ ` + } + ` : ``}` + } + + onParticipantSelect(participant) { + this.value = participant.id + this.dispatchEvent(new CustomEvent('participant-selected', { detail: { participant} })) + } + +} + + +customElements.define('select-participant', SelectParticipant); diff --git a/content-sets/teach/client/create-an-urgent-notification/form.html b/content-sets/teach/client/create-an-urgent-notification/form.html new file mode 100644 index 0000000000..dc52d1347c --- /dev/null +++ b/content-sets/teach/client/create-an-urgent-notification/form.html @@ -0,0 +1,25 @@ + + + + Submitting this form will cause an urgent notification to be create requiring another form to be filled out. + + + diff --git a/content-sets/teach/client/custom-generators.js b/content-sets/teach/client/custom-generators.js new file mode 100644 index 0000000000..603a2c9959 --- /dev/null +++ b/content-sets/teach/client/custom-generators.js @@ -0,0 +1,80 @@ +const yes_no = function() { + const possibilities = [ + [ + { + "label": "yes", + "name": "1", + "value": "" + }, + { + "label": "no", + "name": "0", + "value": "on" + } + ], + [ + { + "label": "yes", + "name": "1", + "value": "on" + }, + { + "label": "no", + "name": "0", + "value": "" + } + ] + ] + return possibilities[Math.floor(Math.random() * possibilities.length)] +} + +const substitutions = [ + { + "type": "caseDoc", + "substitutions": { + "first_name": { + "functionName": "firstname", + "runOnce":"perCase" + }, + "last_name": { + "functionName": "surname", + "runOnce":"perCase" + }, + "participant_id": { + "functionName": "participant_id", + "runOnce":"perCase" + }, + "consent": { + "functionName": "yes_no", + "runOnce": false + } + } + }, + { + "type": "demoDoc", + "formId": "registration-role-1", + "substitutions": { + "first_name": { + "functionName": "firstname", + "runOnce":"perCase" + }, + "last_name": { + "functionName": "surname", + "runOnce":"perCase" + }, + "participant_id": { + "functionName": "participant_id", + "runOnce":"perCase" + }, + "consent": { + "functionName": "yes_no", + "runOnce": false + } + } + } +] + + + +exports.customGenerators = {yes_no} +exports.customSubstitutions = substitutions diff --git a/content-sets/teach/client/custom-report.js b/content-sets/teach/client/custom-report.js new file mode 100644 index 0000000000..df2474950a --- /dev/null +++ b/content-sets/teach/client/custom-report.js @@ -0,0 +1,10 @@ + +async function run() { + let options = {key: 'registration-role-1', include_docs: true, descending: true} + const results = await window.userDb.query('shared_responsesByStartUnixTime', options); + const docs = results.rows.map(row => row.doc) + const element = document.querySelector('#report1'); + element.innerHTML += JSON.stringify(docs) +} + +run().then(r => console.log('done!')) diff --git a/content-sets/teach/client/dynamically-make-an-optional-form-required/form.html b/content-sets/teach/client/dynamically-make-an-optional-form-required/form.html new file mode 100644 index 0000000000..17678e4419 --- /dev/null +++ b/content-sets/teach/client/dynamically-make-an-optional-form-required/form.html @@ -0,0 +1,13 @@ + + + + This form when it was created was optional. However, in this form's `on-open` hook it uses the caseService.markEventFormRequired(caseEventId, eventFormId) API to make itself required. Click back to see that it is now required. + + + diff --git a/content-sets/teach/client/example/form.html b/content-sets/teach/client/example/form.html index 9a9f2da7e6..285283acb2 100644 --- a/content-sets/teach/client/example/form.html +++ b/content-sets/teach/client/example/form.html @@ -1,511 +1,44 @@ - - - - - - + + + diff --git a/content-sets/teach/client/form-internal-behaviour/form.html b/content-sets/teach/client/form-internal-behaviour/form.html new file mode 100644 index 0000000000..ebe50fd74a --- /dev/null +++ b/content-sets/teach/client/form-internal-behaviour/form.html @@ -0,0 +1,319 @@ + + + + + + + + + \ No newline at end of file diff --git a/content-sets/teach/client/form-that-syncs-up-but-not-down/form.html b/content-sets/teach/client/form-that-syncs-up-but-not-down/form.html new file mode 100644 index 0000000000..5eec4795d8 --- /dev/null +++ b/content-sets/teach/client/form-that-syncs-up-but-not-down/form.html @@ -0,0 +1,7 @@ + + + + This form will sync up but not down. + + + diff --git a/content-sets/teach/client/form-with-alternative-template/alt.html b/content-sets/teach/client/form-with-alternative-template/alt.html new file mode 100644 index 0000000000..dd2f37ea65 --- /dev/null +++ b/content-sets/teach/client/form-with-alternative-template/alt.html @@ -0,0 +1,28 @@ +${eval('debugger')} + +

+ Name of the person: ${response.get('person_name')} +

+

+ Likes fruit: ${ + { + 'yes': 'Yes', + 'no': 'No' + }[response.get('likes_fruit')] + } +

+

+ Favorite fruit: ${ + response + .get('favorite_fruits') + .map(key => { + return { + "apple": "Apple", + "tangerine": "Tangerine", + "kiwi": "Kiwi", + "Tomato": "Tomato" + }[key] + }) + .join(', ') + } +

\ No newline at end of file diff --git a/content-sets/teach/client/form-with-alternative-template/form.html b/content-sets/teach/client/form-with-alternative-template/form.html new file mode 100644 index 0000000000..a127811f80 --- /dev/null +++ b/content-sets/teach/client/form-with-alternative-template/form.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/content-sets/teach/client/forms.json b/content-sets/teach/client/forms.json index 2efda7bc2c..17cbe84a58 100755 --- a/content-sets/teach/client/forms.json +++ b/content-sets/teach/client/forms.json @@ -12,35 +12,21 @@ ] }, { - "title": "Student Registration", - "src": "./assets/student-registration/form.html", - "id": "student-registration", - "templates": [ - ] - }, - { - "title": "Class Registration", - "src": "./assets/class-registration/form.html", - "id": "class-registration", - "templates": [ - ] - }, - { - "title": "Attendance", - "src": "./assets/attendance/form.html", - "id": "attendance" - }, - { - "title": "Russian Form", - "src": "./assets/russian/form.html", - "id": "russian", - "templates": [ - { - "src": "./assets/russian/alt.html", - "id": "alt", - "label": "Alternative View" - } - ] + "id" : "about", + "src" : "./assets/about/form.html", + "listed" : false, + "customSyncSettings": { + "enabled": false, + "push": false, + "pull": false, + "excludeIncomplete":false + }, + "couchdbSyncSettings": { + "enabled": true, + "filterByLocation": true, + "push": true, + "pull": true + } }, { "title": "User Profile", @@ -58,29 +44,5 @@ "push" : true, "filterByLocation" : true } - }, - { - "id": "form-internal-behaviour", - "type": "form", - "title": "Comportamientos Int+Ext", - "src": "./assets/form-internal-behaviour/form.html", - "searchSettings": { - "shouldIndex": false, - "variablesToIndex": [], - "primaryTemplate": "", - "secondaryTemplate": "" - }, - "customSyncSettings": { - "enabled": false, - "push": false, - "pull": false, - "excludeIncomplete": false - }, - "couchdbSyncSettings": { - "enabled": false, - "push": true, - "pull": false, - "filterByLocation": false } -} ] diff --git a/content-sets/teach/client/index.html b/content-sets/teach/client/index.html new file mode 100644 index 0000000000..1bcaf105ca --- /dev/null +++ b/content-sets/teach/client/index.html @@ -0,0 +1 @@ + diff --git a/content-sets/teach/client/index.js b/content-sets/teach/client/index.js new file mode 100644 index 0000000000..3d56226a9d --- /dev/null +++ b/content-sets/teach/client/index.js @@ -0,0 +1 @@ +import './components/custom-app.js' diff --git a/content-sets/teach/client/itemized-report.js b/content-sets/teach/client/itemized-report.js new file mode 100644 index 0000000000..b6df9096a7 --- /dev/null +++ b/content-sets/teach/client/itemized-report.js @@ -0,0 +1,23 @@ +class ItemizedReport extends HTMLElement { + + async connectedCallback() { + this.innerHTML += '

Itemized Report

' + let options = {include_docs: true, reduce: false, descending: true} + let results; + // TODO: remove this when finished with debugging + // window['userDb'] = await window.userService.getUserDatabase('admin') + try { + results = await window.userDb.db.query('registrationResults', options); + const docs = results.rows.map(row => row.doc) + // console.log("docs: " + JSON.stringify(docs)) + for (const doc of docs) { + this.innerHTML += `

${doc._id}: ${T.form.Get(doc, 'first_name')} ${T.form.Get(doc, 'last_name')} Consent: ${T.form.Get(doc, 'consent')}

` + } + } catch (e) { + console.log("Error: " + JSON.stringify(e)) + } + } + +} + +customElements.define('itemized-report', ItemizedReport); \ No newline at end of file diff --git a/content-sets/teach/client/load-testing-definitions.json b/content-sets/teach/client/load-testing-definitions.json new file mode 100644 index 0000000000..d7dd64eca0 --- /dev/null +++ b/content-sets/teach/client/load-testing-definitions.json @@ -0,0 +1,13 @@ +[ + { + "type": "caseDoc" + }, + { + "type": "demoDoc", + "formId": "registration-role-1", + "substitutions": { + "first_name": "firstname", + "last_name": "surname" + } + } +] diff --git a/content-sets/teach/client/mark-form-as-required-example--form-1/form.html b/content-sets/teach/client/mark-form-as-required-example--form-1/form.html new file mode 100644 index 0000000000..60f0648f00 --- /dev/null +++ b/content-sets/teach/client/mark-form-as-required-example--form-1/form.html @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/content-sets/teach/client/mark-form-as-required-example--form-2/form.html b/content-sets/teach/client/mark-form-as-required-example--form-2/form.html new file mode 100644 index 0000000000..cb08962ebd --- /dev/null +++ b/content-sets/teach/client/mark-form-as-required-example--form-2/form.html @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/content-sets/teach/client/qr-code-for-registering-case-type-1.png b/content-sets/teach/client/qr-code-for-registering-case-type-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff75ffe8cfa07cada3db28a6bcb301252f6eadcd GIT binary patch literal 3265 zcma)9dpwi-AJ=1JTPKH^oYYvXm|Nu%hHN|2_K>l;?Ud`0SfyMhx59=ZCl*WY$wYEX z>34+Oat?~zFUh5}93z~h2Vd|%J!`+Q%Y*Z1>$-j{EZ1B12$rGk=@ zlG*{%sVr#j_&yLa(6fSFnJ*>vLn25eJB52J+HZH}-`|MqQm{DzT9s81^VRji*y zeU&tN&x>u~IoBzxBS(%*ZfXGPfr`8^xVj+jz2jd?%pTHh9N)Bgi8@OHI>)$)j(QpbTB^Tb~AN>mV9y_`P6dw#lSZV9FgFCQj*Vy64!?W*_<`QqlTKXP$*MO(R zHmO|Hqyw7;oX~3+y8IWVtj;eU6d=`5eyAPRFk zD%sv?*~IzKyXC)FBj=>Uwc;lOpi|P-T+AusY9g$ZRH@*AL*e74EbDrUDZ8bvg`Ba1 zqYK;BG>)HzvWa6$Y2{M%Tl>>V1i?ZKXfrRb`|-xEiBuzPO?sgXL-5Lr*}A{rTf1XcemI^7TT<2)@rgA2^p{zkA5UOJ@4dDpTu2~@7Z4Cf-@^NBcsF3 z$QNha`|pU#^h_oW2J**cE)V-hW@B$JG6d8c_H*F#A2JWu)0B{>9v z7qa+YEWJ!5<>&i`NDVE`mIbCRZ**#>x^Cr1&s=iGeeJR3HAE(atPupB;RL}Rp2x&- zo|Zrj*0IZ-*Fc2O${T-Et4QT($-~iVag*d}c3z8tC3*HCeoODQhr(=jRrK(pd_;RT z7Wm%jTqjBA8JBdiVP1-{x!1k_N1(1i%_-|jIWJPL=8A7N#tH0HB_yHH z=tWetQ3eN?cz!$1ZD1`_d_N%z0JT7#c*(-495YWf`?(l}hYdjeUL%pS1+!wO)dnOG z`j!87WcB|V)%HxIgtVOL9^p{v*u)pmf(s@ZMbKdU}#~o}MEEim_eLVd{qUOrE=AT>hpPYuRpXxrmM{1$eyS=T)I+uju!u=RS z70rqY0Qum)=wM3)t;;_eRrJ^*Y7SrXymwFbZ9Bax5-ae@!gN}rW-AML=M|H0+}(rh zcQYKj#36Ht0~>v&rE1;wJcqWpXcQjd^e_wP+-7m1?OB4-!{R2}@e`LK?IIg2LgWrz za656GaF-PQ<}T^nK-F6q$-0unM;uGf;uiEceWq5rcI>66>KLZgE4Crg)35TWs;DoQ zuLF;z5@M_8K4Z^B%9dL8JHM5{g81<&4-}z-HU8ERC$3-8IYxd)NsEf)_cB

n=FE zWIv^z;V@PWErpL!o}+o*n_V&^t4(Z0JE-_zUiDn44!?eC2RloY!cpA=rC=!ig46~oEL}N3V zjZPa7?IaS(Xs?L2XK~gRxwwcyXmtI@;?MnveUa|>VqE7;>vAKyQ&bk-`F| z--^UkQ9dKH|CDWZCIAZ0W``FQ+>#t?&x*a@=EM^=*FNcBCWZ-3bDoDjY5+J#H?`W# zZF0Ncv2ZIx2|H*0d8?5d>_JklZ(qkIgwv7?5m8w$z2OGCzG(Ol*y`qSv9<3BS5jQ- z(l@02R00}c$p-LL0eT(6I>;gsz^lib#N*|UdylzMbxN+^@9RNfEwt$9DhZazr>kiXi2yWEcW9`y<07kPa( zfaI}DixBs`q|09yg@-=`I-9M*td|<6ZK2=FjQ=(U$!sQ*C3Dk0tB;MLqfTkkW%O;H zb*VB>s3ZeP>J1`f+K+2&RiThu9me@5@YMMC??7g z*Cg+ZdxQ~DOQIk3=?HWzl<0bYX!VtP2CP7*bihOe3eUYS+L;{{f+C84(3q3I?og;J?zX||E+!C4 zrGlX64aO>zxLJr8%8UQAdf5@TCM&H?Z?)I#xZ2V^rIZM8ibogT<>4Ym!7J_y-}U@X z9VCm+2{}!UKxn)*2&P(0l8N_za(h^p4*T6MhajKI_C#>yd0#J+w))?HyD&T3g>}!F zp=}WZOV9o0L(_#*IKtKWW}@03V?XoUyat&@MC9G6I`N}+c%7&0uu(=zluTYeRlpE< z`iBXUF*6F33*x`&7AG39wc%}bq#On?M+5uGurX_n95xzT3vu`Z@jb<&#k=$0Rh1R! zF2fKgy7!x>1aR% zysND#8KvJ{a}WyK^TaxL{t=2Ov^z~Vg0l&M8+8(drLrR;B4j&#GKf>G*pkliptB)- zj9@+r=~<0tGm`Zcj*kkjURh6&-tZl*Rx?{92&iyKe(ui>E@b9&yY;LfV;C(z>L?w^ z$0t7awISn0pA9ctDkQd!@Uj%eg(^|%Agy{y;k^B09f-e*4n?-vye=nwHxUms(@e=3 z@5Vk2m_BhB(3q&yq&EsvBe;kxsfN0GhqPmAaPw@1eMDcG(y38}VyGKRu5PnB+H@ zLS*>%;=ogl;WHk0q1Ia?7x1f_gy`Nm39pjB(PM&660PUTb zJ_@F$fW&sa<)iUM1^V6sNZ~ja4?~XrrS`c-0t`aG{scTl>Mb*CX3nN R%!jTfQlK@1T1oNZ{}<+O#?}A; literal 0 HcmV?d00001 diff --git a/content-sets/teach/client/queries.js b/content-sets/teach/client/queries.js new file mode 100644 index 0000000000..fcb08e8a3b --- /dev/null +++ b/content-sets/teach/client/queries.js @@ -0,0 +1,35 @@ +[ + { + "id": "registrationResults", + "version": "1", + "view": { + "map": function (doc) { + if (doc.form && doc.form.id) { + const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + const startUnixtime = new Date(doc.startUnixtime); + const key = doc.form.id + '_' + startUnixtime.getFullYear() + '_' + MONTHS[startUnixtime.getMonth()]; + //The emmitted value is in the form \"formId\" i.e `formId` and also \"formId_2018_May\" i.e `formId_Year_Month` + if (doc.form.id === 'registration-role-1') { + if (T.form.Get(doc, 'consent') === 'yes') { + return emit(key, [1, 0]); + } else { + return emit(key, [0, 1]); + } + } + } + }, + "reduce": "_sum" + } + }, + { + "id": "shared_responsesByStartUnixTime", + "version": "1", + "view": { + "map": function (doc) { + if (doc.collection === "TangyFormResponse") { + return emit(doc.startUnixtime, true); + } + } + } + } +] diff --git a/content-sets/teach/client/registration-role-1/form.html b/content-sets/teach/client/registration-role-1/form.html new file mode 100644 index 0000000000..5f2399f47a --- /dev/null +++ b/content-sets/teach/client/registration-role-1/form.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + They do not qualify. Continue to finish the form. + + + + + Thank you for your time. This form may now be submitted. + + + diff --git a/content-sets/teach/client/registration-role-2/form.html b/content-sets/teach/client/registration-role-2/form.html new file mode 100644 index 0000000000..9afc5da033 --- /dev/null +++ b/content-sets/teach/client/registration-role-2/form.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + They do not qualify. Continue to finish the form. + + + + + Thank you for your time. This form may now be submitted. + + + \ No newline at end of file diff --git a/content-sets/teach/client/reports.html b/content-sets/teach/client/reports.html new file mode 100644 index 0000000000..d6254618f4 --- /dev/null +++ b/content-sets/teach/client/reports.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/content-sets/teach/client/reports.js b/content-sets/teach/client/reports.js new file mode 100644 index 0000000000..66001ae6a2 --- /dev/null +++ b/content-sets/teach/client/reports.js @@ -0,0 +1,6 @@ +async function run() { + + +} + +//run().then(r => console.log('done!')) diff --git a/content-sets/teach/client/resolve-an-urgent-notification/form.html b/content-sets/teach/client/resolve-an-urgent-notification/form.html new file mode 100644 index 0000000000..2e473f3ca2 --- /dev/null +++ b/content-sets/teach/client/resolve-an-urgent-notification/form.html @@ -0,0 +1,15 @@ + + + + Submitting this form will resolve the urgent notification related to it. + + + diff --git a/content-sets/teach/client/select-participant.js b/content-sets/teach/client/select-participant.js new file mode 100644 index 0000000000..620109c2da --- /dev/null +++ b/content-sets/teach/client/select-participant.js @@ -0,0 +1,63 @@ +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { LitElement, html, unsafeHtml } from 'lit-element'; +import { t } from 'tangy-form/util/t.js' + + +export class SelectParticipant extends LitElement { + + constructor() { + super() + this.value = '' + this.participants = [] + } + + static get properties() { + return { + name: { type: String }, + value: { type: String }, + caseId: { type: String }, + participants: { type: Array }, + ready: { type: Boolean } + } + } + + async connectedCallback() { + super.connectedCallback() + await T.caseDefinition.load() + const caseInstance = await T.tangyForms.getResponse(this.caseId) + const caseDefinitionFormId = caseInstance.form.id + const caseDefinition = T.caseDefinition.caseDefinitions.find(cd => cd.formId === caseDefinitionFormId) + this.participants = caseInstance.participants.map(participant => { + let renderedListItem + const roleDefinition = caseDefinition.caseRoles.find(role => role.id === participant.caseRoleId) + eval(`renderedListItem = \`${roleDefinition.templateListItem}\``) + return { + id: participant.id, + listItem: renderedListItem + } + }) + this.ready = true + } + + render() { + return html` + ${this.ready ? html` +

    + ${this.participants.map(participant => html` +
  • ${participant.listItem}
  • + `)} +
+ `:``} + ` + } + + onParticipantSelect(participant) { + this.value = participant.id + this.dispatchEvent(new CustomEvent('participant-selected', { detail: { participant} })) + } + +} + + +customElements.define('select-participant', SelectParticipant); diff --git a/content-sets/teach/client/skip-section/form.html b/content-sets/teach/client/skip-section/form.html new file mode 100644 index 0000000000..a0f94006e5 --- /dev/null +++ b/content-sets/teach/client/skip-section/form.html @@ -0,0 +1,61 @@ + + + + + + + + + + + diff --git a/content-sets/teach/client/student-registration/form.html b/content-sets/teach/client/student-registration/form.html index 51ca4c1f5d..1bc0af6eec 100644 --- a/content-sets/teach/client/student-registration/form.html +++ b/content-sets/teach/client/student-registration/form.html @@ -22,6 +22,9 @@ required> + + + + row.value) + this.innerHTML += `

Consent: Yes: ${docs[0][0]} No: ${docs[0][1]}

` + } catch (e) { + console.log("Error: " + JSON.stringify(e)) + } + } + +} + +customElements.define('summarized-report', SummarizedReport); \ No newline at end of file diff --git a/content-sets/teach/client/template-event-form-listing/form.html b/content-sets/teach/client/template-event-form-listing/form.html new file mode 100644 index 0000000000..6b45089afc --- /dev/null +++ b/content-sets/teach/client/template-event-form-listing/form.html @@ -0,0 +1,11 @@ + + + + + diff --git a/content-sets/teach/client/template-event-listing/form.html b/content-sets/teach/client/template-event-listing/form.html new file mode 100644 index 0000000000..cacf6fb936 --- /dev/null +++ b/content-sets/teach/client/template-event-listing/form.html @@ -0,0 +1,11 @@ + + + + + diff --git a/content-sets/teach/client/test-form/form.html b/content-sets/teach/client/test-form/form.html new file mode 100644 index 0000000000..27533cf362 --- /dev/null +++ b/content-sets/teach/client/test-form/form.html @@ -0,0 +1,5 @@ + + + + +
diff --git a/content-sets/teach/client/test-issues-created-on-client/form.html b/content-sets/teach/client/test-issues-created-on-client/form.html new file mode 100644 index 0000000000..221666a69c --- /dev/null +++ b/content-sets/teach/client/test-issues-created-on-client/form.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/content-sets/teach/client/test-issues-created-programatically-on-client/form.html b/content-sets/teach/client/test-issues-created-programatically-on-client/form.html new file mode 100644 index 0000000000..c827df752b --- /dev/null +++ b/content-sets/teach/client/test-issues-created-programatically-on-client/form.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/content-sets/teach/client/test-issues-created-programatically-on-client/print-me.html b/content-sets/teach/client/test-issues-created-programatically-on-client/print-me.html new file mode 100644 index 0000000000..db15f795b9 --- /dev/null +++ b/content-sets/teach/client/test-issues-created-programatically-on-client/print-me.html @@ -0,0 +1,4 @@ +${(()=>{debugger; return ''})()} +Please print this.
+Address:
+${response.inputsByName.address.value} \ No newline at end of file diff --git a/content-sets/teach/client/transfer-participant/form.html b/content-sets/teach/client/transfer-participant/form.html new file mode 100644 index 0000000000..9ede685b6c --- /dev/null +++ b/content-sets/teach/client/transfer-participant/form.html @@ -0,0 +1,5 @@ + + + + + diff --git a/content-sets/teach/client/user-profile/form.html b/content-sets/teach/client/user-profile/form.html index e268d1e51f..9fcf75e646 100755 --- a/content-sets/teach/client/user-profile/form.html +++ b/content-sets/teach/client/user-profile/form.html @@ -1,19 +1,6 @@ - + - - - - - \ No newline at end of file diff --git a/content-sets/teach/client/workflow-form-1/form.html b/content-sets/teach/client/workflow-form-1/form.html new file mode 100644 index 0000000000..39fe62e738 --- /dev/null +++ b/content-sets/teach/client/workflow-form-1/form.html @@ -0,0 +1,14 @@ + + + + This is the first form in a series of three. On submit, you will be forward to the second form. + + + diff --git a/content-sets/teach/client/workflow-form-2/form.html b/content-sets/teach/client/workflow-form-2/form.html new file mode 100644 index 0000000000..86a7c8d08f --- /dev/null +++ b/content-sets/teach/client/workflow-form-2/form.html @@ -0,0 +1,14 @@ + + + + This is the second form in a series of three. On submit, you will be forward to the third form. + + + diff --git a/content-sets/teach/client/workflow-form-3/form.html b/content-sets/teach/client/workflow-form-3/form.html new file mode 100644 index 0000000000..877025a3a3 --- /dev/null +++ b/content-sets/teach/client/workflow-form-3/form.html @@ -0,0 +1,13 @@ + + + + This is the third form in a series of three. On submit, you will be forward back to the home screen. + + + From d514d77f28405609b9908240a75ce05a9d557717 Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 14 Dec 2023 14:02:54 -0500 Subject: [PATCH 05/43] Remove pencil icon from Grade button --- .../app/class/class-nav-bar/class-nav-bar.component.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/app/class/class-nav-bar/class-nav-bar.component.html b/client/src/app/class/class-nav-bar/class-nav-bar.component.html index 97dc2a7657..5d57378993 100644 --- a/client/src/app/class/class-nav-bar/class-nav-bar.component.html +++ b/client/src/app/class/class-nav-bar/class-nav-bar.component.html @@ -1,6 +1,5 @@ @@ -8,12 +7,12 @@ - - From bd70f37dff4c512230a330084f7f5797595ca14b Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 14 Dec 2023 14:24:10 -0500 Subject: [PATCH 06/43] Make client show an editable About page --- client/src/app/app.component.html | 54 ++++++++++--------- client/src/app/core/about/about.module.ts | 4 +- .../app/core/about/about/about.component.html | 36 +------------ .../app/core/about/about/about.component.ts | 27 +++++----- .../export-data/export-data.component.html | 4 +- .../settings/settings/settings.component.html | 16 ++++++ .../settings/settings/settings.component.ts | 13 ++++- .../app/shared/_classes/app-config.class.ts | 2 + .../tangy-forms-player.component.ts | 15 +++--- translations/translation.en.json | 1 - 10 files changed, 88 insertions(+), 84 deletions(-) diff --git a/client/src/app/app.component.html b/client/src/app/app.component.html index ff75e18863..b770f47f6c 100755 --- a/client/src/app/app.component.html +++ b/client/src/app/app.component.html @@ -23,56 +23,62 @@ - - - - - - + - - + + + + + + + + - +
diff --git a/client/src/app/core/about/about.module.ts b/client/src/app/core/about/about.module.ts index 1eb0089f0c..d954b24567 100644 --- a/client/src/app/core/about/about.module.ts +++ b/client/src/app/core/about/about.module.ts @@ -3,13 +3,15 @@ import { CommonModule } from '@angular/common'; import { AboutRoutingModule } from './about-routing.module'; import { AboutComponent } from './about/about.component'; +import { TangyFormsModule } from '../../tangy-forms/tangy-forms.module'; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], declarations: [AboutComponent], imports: [ CommonModule, - AboutRoutingModule + AboutRoutingModule, + TangyFormsModule ] }) export class AboutModule { } diff --git a/client/src/app/core/about/about/about.component.html b/client/src/app/core/about/about/about.component.html index 0f47d4025c..3c11a89366 100644 --- a/client/src/app/core/about/about/about.component.html +++ b/client/src/app/core/about/about/about.component.html @@ -1,35 +1,3 @@
-

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable capture of students’ responses in oral reading and mathematics skills assessments as well as interview responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software simplifies the preparation and implementation of field work, reduces student assessment times, reduces measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is optimized for offline data collection in low-bandwidth environments and features powerful sync and data backup options. -

-

- Tangerine was developed by RTI Internationalstarting in 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the public through an open-source GNU General Public License. You can host it on your own server and modify its code as needed. The only requirement is that if you share your modified version publicly, you also need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. While originally developed for education, Tangerine is increasingly used also for interviews and field observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
- -
-
{{info.serverUrl}}
-
{{info.groupName}}
-
{{info.groupId}}
-
{{info.buildChannel}}
-
{{info.buildId}}
-
{{info.deviceId}}
-
{{info.tangerineVersion}}
-
{{info.versionTag}}
-
-
{{info.encryptionLevel}}
-
-
\ No newline at end of file + +
\ No newline at end of file diff --git a/client/src/app/core/about/about/about.component.ts b/client/src/app/core/about/about/about.component.ts index 1d2e03cae9..deb507c161 100644 --- a/client/src/app/core/about/about/about.component.ts +++ b/client/src/app/core/about/about/about.component.ts @@ -1,6 +1,7 @@ import { _TRANSLATE } from 'src/app/shared/translation-marker'; -import { AppInfo, DeviceService } from './../../../device/services/device.service'; -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { TangyFormsPlayerComponent } from './../../../tangy-forms/tangy-forms-player/tangy-forms-player.component'; +import { Subject } from 'rxjs'; @Component({ selector: 'app-about', @@ -9,20 +10,18 @@ import { Component, OnInit } from '@angular/core'; }) export class AboutComponent implements OnInit { - info:AppInfo - ready = false - - constructor( - private deviceService:DeviceService - ) { } + appConfig = window['appConfig'] + @ViewChild('formPlayer', {static: true}) formPlayer: TangyFormsPlayerComponent + $afterSubmit = new Subject() async ngOnInit() { - const info = this.deviceService.getAppInfo() - this.info = { - ...info, - deviceId: info.deviceId ? info.deviceId.substr(0,6) : _TRANSLATE('Log in to see Device ID') - } - this.ready = true + this.formPlayer.formId = "about"; + this.formPlayer.$beforeSubmit.subscribe(() => { this.closeAbout() }); + this.formPlayer.render() + } + + closeAbout() { + window.location.href = this.appConfig.homeUrl } } diff --git a/client/src/app/core/export-data/export-data/export-data.component.html b/client/src/app/core/export-data/export-data/export-data.component.html index 19b642d0a7..2f69effe67 100644 --- a/client/src/app/core/export-data/export-data/export-data.component.html +++ b/client/src/app/core/export-data/export-data/export-data.component.html @@ -1,10 +1,10 @@ - +
- {{'Export Backup'|translate}} + {{'Export Data'|translate}}

{{'Export Data creates a backup of all of your records and saves it to your device.'|translate}}

diff --git a/client/src/app/core/settings/settings/settings.component.html b/client/src/app/core/settings/settings/settings.component.html index e057b90a96..cd51575a84 100644 --- a/client/src/app/core/settings/settings/settings.component.html +++ b/client/src/app/core/settings/settings/settings.component.html @@ -10,5 +10,21 @@

{{'Class Configuration'|translate}}

+
+ +
+
{{info.serverUrl}}
+
{{info.groupName}}
+
{{info.groupId}}
+
{{info.buildChannel}}
+
{{info.buildId}}
+
{{info.deviceId}}
+
{{info.tangerineVersion}}
+
{{info.versionTag}}
+
+
{{info.encryptionLevel}}
+
+
+
diff --git a/client/src/app/core/settings/settings/settings.component.ts b/client/src/app/core/settings/settings/settings.component.ts index 8adf8eea8a..a81a07eb0d 100644 --- a/client/src/app/core/settings/settings/settings.component.ts +++ b/client/src/app/core/settings/settings/settings.component.ts @@ -10,6 +10,7 @@ import {TangyFormsInfoService} from "../../../tangy-forms/tangy-forms-info-servi import {ClassFormService} from "../../../class/_services/class-form.service"; import {_TRANSLATE} from "../../../shared/translation-marker"; import {TangyFormResponse} from "../../../tangy-forms/tangy-form-response.class"; +import { AppInfo, DeviceService } from './../../../device/services/device.service'; @Component({ selector: 'app-settings', @@ -26,6 +27,9 @@ export class SettingsComponent implements OnInit, AfterContentInit { selected = '' classes: any; showClassConfig = false; + info:AppInfo + ready = false; + constructor( private http: HttpClient, private variableService: VariableService, @@ -34,6 +38,7 @@ export class SettingsComponent implements OnInit, AfterContentInit { private dashboardService: DashboardService, private tangyFormsInfoService: TangyFormsInfoService, private classFormService: ClassFormService, + private deviceService:DeviceService ) { } async ngOnInit(): Promise { @@ -42,7 +47,6 @@ export class SettingsComponent implements OnInit, AfterContentInit { this.showClassConfig = true; await this.classFormService.initialize(); this.classes = await this.dashboardService.getMyClasses(); - console.log("Got classes") } } @@ -100,6 +104,13 @@ export class SettingsComponent implements OnInit, AfterContentInit { alert(t('Settings have been updated. You will now be redirected to log in.')) window.location.href = window.location.href.replace(window.location.hash, 'index.html') }) + + const info = this.deviceService.getAppInfo() + this.info = { + ...info, + deviceId: info.deviceId ? info.deviceId.substr(0,6) : _TRANSLATE('Log in to see Device ID') + } + this.ready = true; } async toggleClass(id) { diff --git a/client/src/app/shared/_classes/app-config.class.ts b/client/src/app/shared/_classes/app-config.class.ts index 1ea6d1d68b..a7d97826bd 100644 --- a/client/src/app/shared/_classes/app-config.class.ts +++ b/client/src/app/shared/_classes/app-config.class.ts @@ -86,6 +86,8 @@ export class AppConfig { centrallyManagedUserProfile = false // Hides the user profile link to edit when on the Device. hideProfile = false + // Hides the about page. + hideAbout = false // When using Sync Protocol 2 and associating a new Device Account with a Device User, setting this to true will show them all Device Users synced // down to the Device rather than filtering those Device Users based on the single Device Assignment. disableDeviceUserFilteringByAssignment:boolean diff --git a/client/src/app/tangy-forms/tangy-forms-player/tangy-forms-player.component.ts b/client/src/app/tangy-forms/tangy-forms-player/tangy-forms-player.component.ts index c9c270680c..570501699a 100755 --- a/client/src/app/tangy-forms/tangy-forms-player/tangy-forms-player.component.ts +++ b/client/src/app/tangy-forms/tangy-forms-player/tangy-forms-player.component.ts @@ -34,13 +34,14 @@ export class TangyFormsPlayerComponent implements OnInit { @Input('preventSubmit') preventSubmit = false @Input('metadata') metadata: any - $rendered = new Subject() - $beforeSubmit = new Subject() - $submit = new Subject() - $afterSubmit = new Subject() - $resubmit = new Subject() - $afterResubmit = new Subject() - $saved = new Subject() + // making these public allows parent components to subscribe to them. + public readonly $rendered = new Subject() + public readonly $beforeSubmit = new Subject() + public readonly $submit = new Subject() + public readonly $afterSubmit = new Subject() + public readonly $resubmit = new Subject() + public readonly $afterResubmit = new Subject() + public readonly $saved = new Subject() rendered = false _inject = {} diff --git a/translations/translation.en.json b/translations/translation.en.json index 9b0e5edd6f..dee3d51c65 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -84,7 +84,6 @@ "Error Downloading File": "Error Downloading File", "Error restoring db ": "Error restoring db ", "Event": "Event", - "Export Backup": "Export Backup", "Export Data": "Export Data", "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", "Failed to download application configuration file": "Failed to download application configuration file", From 1e323506e4946af417dfbd5ff9806a005d2a89f4 Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 14 Dec 2023 14:02:54 -0500 Subject: [PATCH 07/43] Remove pencil icon from Grade button --- .../app/class/class-nav-bar/class-nav-bar.component.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/src/app/class/class-nav-bar/class-nav-bar.component.html b/client/src/app/class/class-nav-bar/class-nav-bar.component.html index 97dc2a7657..5d57378993 100644 --- a/client/src/app/class/class-nav-bar/class-nav-bar.component.html +++ b/client/src/app/class/class-nav-bar/class-nav-bar.component.html @@ -1,6 +1,5 @@ @@ -8,12 +7,12 @@ - - From c6d593fe43d14cba1ad6f52e20163ba9cfc3cf9a Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 14 Dec 2023 15:30:52 -0500 Subject: [PATCH 08/43] Add hide/show toggle for client login and register components --- client/src/app/core/auth/login/login.component.html | 10 ++++++---- client/src/app/core/auth/login/login.component.ts | 1 + .../core/auth/registration/registration.component.html | 8 +++++--- .../core/auth/registration/registration.component.ts | 1 + 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/client/src/app/core/auth/login/login.component.html b/client/src/app/core/auth/login/login.component.html index 5b155216fc..900ed25139 100755 --- a/client/src/app/core/auth/login/login.component.html +++ b/client/src/app/core/auth/login/login.component.html @@ -29,15 +29,16 @@ - + lock_open {{'Password'|translate}} + {{hidePassword ? 'visibility_off' : 'visibility'}}
- + lock_open{{'Admin Password'|translate}} @@ -50,13 +51,14 @@ - + lock_open{{'New Password'|translate}} + {{hidePassword ? 'visibility_off' : 'visibility'}} - + lock_open{{'Confirm New Password'|translate}} diff --git a/client/src/app/core/auth/login/login.component.ts b/client/src/app/core/auth/login/login.component.ts index 255e3e3edc..b7b8341a54 100755 --- a/client/src/app/core/auth/login/login.component.ts +++ b/client/src/app/core/auth/login/login.component.ts @@ -30,6 +30,7 @@ export class LoginComponent implements OnInit { listUsernamesOnLoginScreen; requiresAdminPassword = false noPassword = false + hidePassword = true passwordPolicy: string passwordRecipe: string constructor( diff --git a/client/src/app/core/auth/registration/registration.component.html b/client/src/app/core/auth/registration/registration.component.html index 8bb88b3138..f59344e821 100755 --- a/client/src/app/core/auth/registration/registration.component.html +++ b/client/src/app/core/auth/registration/registration.component.html @@ -13,10 +13,11 @@
- + lock_open{{'Admin Password'|translate}} + {{hidePassword ? 'visibility_off' : 'visibility'}} @@ -26,14 +27,15 @@
- + lock_open{{'Password'|translate}} + {{hidePassword ? 'visibility_off' : 'visibility'}}
- + lock_open{{'Confirm Password'|translate}} diff --git a/client/src/app/core/auth/registration/registration.component.ts b/client/src/app/core/auth/registration/registration.component.ts index ca051f54ee..6598bd510e 100755 --- a/client/src/app/core/auth/registration/registration.component.ts +++ b/client/src/app/core/auth/registration/registration.component.ts @@ -37,6 +37,7 @@ export class RegistrationComponent implements OnInit { passwordPolicy: string passwordRecipe: string noPassword = false + hidePassword = true constructor( private userService: UserService, private route: ActivatedRoute, From f6b7c0c140d26ce3ada0546b6af868562bd54ff5 Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 10:56:01 -0500 Subject: [PATCH 09/43] Prevent derefernce of studentRegistrationFields --- client/src/app/class/_services/dashboard.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/class/_services/dashboard.service.ts b/client/src/app/class/_services/dashboard.service.ts index def1e2fed7..98203bc29a 100644 --- a/client/src/app/class/_services/dashboard.service.ts +++ b/client/src/app/class/_services/dashboard.service.ts @@ -1053,7 +1053,7 @@ export class DashboardService { // const curriculumFormHtml = await this.getCurriculaForms(curriculum.name); // const curriculumFormsList = await this.classUtils.createCurriculumFormsList(curriculumFormHtml); const appConfig = await this.appConfigService.getAppConfig(); - const studentRegistrationFields = appConfig.teachProperties?.studentRegistrationFields + const studentRegistrationFields = appConfig.teachProperties?.studentRegistrationFields || [] const list = [] for (const student of students) { let studentResult From 7dfcc8cebfb23d5ab3ad6f0c14a70243a353a2d6 Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 12:01:05 -0500 Subject: [PATCH 10/43] Add hint text to atttendence, behavior and score; fix loading of students" --- .../attendance-check.component.css | 7 +++++ .../attendance-check.component.html | 3 ++ .../attendance-scores.component.css | 7 +++++ .../attendance-scores.component.html | 5 ++-- .../behavior-check.component.css | 10 ++++++- .../behavior-check.component.html | 18 ++++------- .../behavior-check.component.ts | 30 ++----------------- translations/translation.en.json | 4 +++ 8 files changed, 40 insertions(+), 44 deletions(-) diff --git a/client/src/app/class/attendance/attendance-check/attendance-check.component.css b/client/src/app/class/attendance/attendance-check/attendance-check.component.css index 92f426b096..0a21acff70 100644 --- a/client/src/app/class/attendance/attendance-check/attendance-check.component.css +++ b/client/src/app/class/attendance/attendance-check/attendance-check.component.css @@ -19,4 +19,11 @@ mat-chip-list.absent { padding-left: 5px; padding-right: 5px; text-align: center; +} + +.tableHintLabel { + padding-top: 5px; + padding-left: 5px; + padding-right: 5px; + text-align: center; } \ No newline at end of file diff --git a/client/src/app/class/attendance/attendance-check/attendance-check.component.html b/client/src/app/class/attendance/attendance-check/attendance-check.component.html index 298887ebc4..188433cb30 100644 --- a/client/src/app/class/attendance/attendance-check/attendance-check.component.html +++ b/client/src/app/class/attendance/attendance-check/attendance-check.component.html @@ -1,5 +1,8 @@
{{'Attendance'|translate}}
{{getClassTitle(selectedClass)}} : {{curriculum?.label}} : {{reportLocaltime}}
+
+ {{'Tap on the green checkmark to mark a student as absent'|translate}} +
diff --git a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.css b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.css index 2480e44759..82d407442a 100644 --- a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.css +++ b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.css @@ -32,6 +32,13 @@ input[type=number] { text-align: center; } +.tableHintLabel { + padding-top: 5px; + padding-left: 5px; + padding-right: 5px; + text-align: center; +} + .controls-wrapper { display: grid; grid-template-columns: repeat(2, 1fr); diff --git a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html index 169c9447b5..1f00bdfce0 100644 --- a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html +++ b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html @@ -1,5 +1,4 @@ -
{{'Scores'|translate}}
{{getClassTitle(selectedClass)}} : {{curriculum?.label}}
@@ -13,7 +12,9 @@
-
+
+ {{'Select a unit to enter scoring for those units.'|translate}} +
diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.css b/client/src/app/class/attendance/behavior-check/behavior-check.component.css index bf0e487694..bce676bafc 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.css +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.css @@ -14,6 +14,13 @@ text-align: center; } +.tableHintLabel { + padding-top: 5px; + padding-left: 5px; + padding-right: 5px; + text-align: center; +} + .concerning { background-color: #de9c75 !important; } @@ -58,7 +65,7 @@ /* color: white;*/ /*}*/ -.dashboard-table .checkbox-response { +.dashboard-table { text-align: center; } @@ -68,6 +75,7 @@ text-decoration:underline; padding-left: 1em; padding-right:5px; + text-align: left; } input[type=checkbox] { diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.html b/client/src/app/class/attendance/behavior-check/behavior-check.component.html index 7d9f78058a..390d06a288 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.html +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.html @@ -1,5 +1,8 @@
{{'Behavior'|translate}}
{{getClassTitle(selectedClass)}} : {{curriculum?.label}} : {{reportLocaltime}}
+
+ {{'Tap the link to complete the student behavior form'|translate}} +
@@ -11,30 +14,19 @@ - - - + diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts index 2817456063..c3cae91118 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts @@ -172,7 +172,6 @@ export class BehaviorCheckComponent implements OnInit { /** Navigate to the student registration form */ selectStudentName(column) { - const formsArray = Object.values(column.forms); const studentId = column.id; const classId = column.classId; this.router.navigate(['class-form'], { queryParams: @@ -183,12 +182,8 @@ export class BehaviorCheckComponent implements OnInit { getClassTitle = this.dashboardService.getClassTitle /** Populate the querystring with the form info. */ - selectCheckboxResult(column, formId, event) { - // let el = this.selection.select(column); + selectStudentFormResults(column, formId, event) { event.currentTarget.checked = true; - // this.selection.toggle(column) - const formsArray = Object.values(column.forms); - const selectedForm = formsArray.find(response => (response['formId'] === formId)); const studentId = column.id; const classId = column.classId; // const selectedFormId = selectedForm['formId']; @@ -212,36 +207,15 @@ export class BehaviorCheckComponent implements OnInit { * This is for new forms without responses. * Populate the querystring with the form info. **/ - async selectCheckbox(column, formId) { - // let el = this.selection.select(row); - // this.selection.toggle(column) - // const formsArray = Object.values(column.forms); - // const selectedForm = formsArray.find(response => (response['formId'] === formId)); + async selectStudentForm(column, formId) { const studentId = column.id; const classId = column.classId; - // const selectedFormId = selectedForm['formId']; const selectedFormId = null; - // const curriculum = selectedForm['curriculum']; const curriculum = formId; const src = null; const title = null; let responseId = null; - // const formResponse = await this.dashboardService.getCurriculumResponse(classId, curriculum, studentId) - // const responses = await this.classFormService.getResponsesByStudentId(studentId); - // for (const response of responses as any[]) { - // // const respClassId = response.doc.metadata.studentRegistrationDoc.classId; - // const respFormId = response.doc.form.id; - // // if (respClassId === this.classId && respCurrId === this.curriculum) { - // // this.formResponse = response.doc; - // // } - // studentResult['forms'][respFormId] = response.doc; - // } - - // if (selectedForm) { - // responseId = selectedForm['_id'] - // } - this.router.navigate(['class-form'], { queryParams: { formId: selectedFormId, curriculum: curriculum, diff --git a/translations/translation.en.json b/translations/translation.en.json index 9b0e5edd6f..4e753fe396 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -237,6 +237,7 @@ "Searching": "Searching", "Searching...": "Searching...", "Security question is required": "Security question is required", + "Select a unit to enter scoring for those units": "Select a unit to enter scoring for those units", "Select Form Name": "Select Form Name", "Select Report": "Select Report", "Select Student": "Select Student", @@ -280,6 +281,8 @@ "Syncing Status By User": "Syncing Status By User", "Syncing Status Summary": "Syncing Status Summary", "Tangerine": "Tangerine", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Tap any boxes that were incorrect during the test.": "Tap any boxes that were incorrect during the test.", "Tap items to mark them incorrect.": "Tap items to mark them incorrect.", "Tap the item last attempted.": "Tap the item last attempted.", @@ -356,6 +359,7 @@ "manifest": "manifest", "merged": "merged", "new case": "new case", + "new form": "new form", "new issue": "new issue", "next": "Next", "no": "no", From 158ef8149af32af0c5da7529513a84afc84c26d5 Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 15:46:53 -0500 Subject: [PATCH 11/43] Add student behavior css --- .../behavior-check/behavior-check.component.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.css b/client/src/app/class/attendance/behavior-check/behavior-check.component.css index bce676bafc..8067e034a6 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.css +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.css @@ -78,6 +78,15 @@ text-align: left; } +.student-behavior { + cursor:pointer; + color:blue; + text-decoration:underline; + padding-left: 1em; + padding-right:5px; + text-align: center; +} + input[type=checkbox] { transform: scale(1.5); margin: 10px; From 939c7d9a503ad8a8584c1e993ca9aecad358ce66 Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 15:49:53 -0500 Subject: [PATCH 12/43] Add Tangy Snackbar Service to Client and messages in teach --- .../attendance-check.component.html | 82 ----------------- .../attendance-check.component.ts | 89 +++++-------------- .../attendance-scores.component.html | 12 +-- .../attendance-scores.component.ts | 39 +++----- .../_services/tangy-snackbar.service.ts | 21 +++++ client/src/app/shared/shared.module.ts | 10 ++- translations/translation.en.json | 2 +- 7 files changed, 67 insertions(+), 188 deletions(-) create mode 100644 client/src/app/shared/_services/tangy-snackbar.service.ts diff --git a/client/src/app/class/attendance/attendance-check/attendance-check.component.html b/client/src/app/class/attendance/attendance-check/attendance-check.component.html index 188433cb30..9177b2ae37 100644 --- a/client/src/app/class/attendance/attendance-check/attendance-check.component.html +++ b/client/src/app/class/attendance/attendance-check/attendance-check.component.html @@ -26,88 +26,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{student["student_name"]}} {{student["student_surname"]}} - - - - + 'centered': true}" (click)="$event ? selectStudentFormResults(student,'form-internal-behaviour',$event) : null"> {{student['behavior']['internalPercentage']}}% - - {{'New Form'|translate}}

{{'No Students currently registered.'|translate}}

diff --git a/client/src/app/class/attendance/attendance-check/attendance-check.component.ts b/client/src/app/class/attendance/attendance-check/attendance-check.component.ts index 358ef2046a..1f2a1f34ea 100644 --- a/client/src/app/class/attendance/attendance-check/attendance-check.component.ts +++ b/client/src/app/class/attendance/attendance-check/attendance-check.component.ts @@ -8,7 +8,7 @@ import {StudentResult} from "../../dashboard/dashboard.component"; import {UserService} from "../../../shared/_services/user.service"; import {FormMetadata} from "../../form-metadata"; import {ClassFormService} from "../../_services/class-form.service"; - +import { TangySnackbarService } from 'src/app/shared/_services/tangy-snackbar.service'; @Component({ selector: 'app-attendance-check', @@ -45,7 +45,8 @@ export class AttendanceCheckComponent implements OnInit { private dashboardService: DashboardService, private variableService : VariableService, private router: Router, - private classFormService: ClassFormService + private classFormService: ClassFormService, + private tangySnackbarService: TangySnackbarService ) { } async ngOnInit(): Promise { @@ -77,7 +78,9 @@ export class AttendanceCheckComponent implements OnInit { /** * Shim attendance into the currArray so it'll appear in the dropdown. * Makes attendance the selectedCurriculum. - * @param cassId + * @param currentClassId + * @param curriculum + * @param currentClass */ async showAttendanceListing(currentClassId, curriculum, currentClass) { const type = "attendance" @@ -126,46 +129,46 @@ export class AttendanceCheckComponent implements OnInit { this.attendanceRegister = currentAttendanceReport } if (students.length > 0) { - await this.saveStudentAttendance(null) - } else { - const startRegister = confirm(_TRANSLATE('There are no students. Begin ' + registerNameForDialog + ' record for today anyways?')) - if (startRegister) { - await this.saveStudentAttendance(null) - } + await this.saveStudentAttendance() } + } async toggleAttendance(student) { student.absent = !student.absent - await this.saveStudentAttendance(student) + await this.saveStudentAttendance() } async toggleMood(mood, student) { student.mood = mood if (!student.absent) { - await this.saveStudentAttendance(student) + await this.saveStudentAttendance() } } - private async saveStudentAttendance(student) { - console.log('saved student attendance: ' + JSON.stringify(student)) + private async saveStudentAttendance() { // save allStudentResults this.attendanceRegister.attendanceList = this.attendanceList // save attendanceRegister let currentAttendanceReport try { - currentAttendanceReport = await this.dashboardService.getDoc(this.attendanceRegister._id) + currentAttendanceReport = await this.dashboardService.getDoc(this.attendanceRegister._id) this.attendanceRegister['_rev'] = currentAttendanceReport._rev } catch (e) { + // Catches the non-existing doc error + } + + try { + await this.dashboardService.saveDoc(this.attendanceRegister) + this.tangySnackbarService.showText(_TRANSLATE('Saved')); + } catch (e) { + this.tangySnackbarService.showText(_TRANSLATE('Error saving. Please try again.')); } - - await this.dashboardService.saveDoc(this.attendanceRegister) } /** Navigate to the student registration form */ selectStudentName(column) { - const formsArray = Object.values(column.forms); const studentId = column.id; const classId = column.classId; this.router.navigate(['class-form'], { queryParams: @@ -175,56 +178,4 @@ export class AttendanceCheckComponent implements OnInit { getClassTitle = this.dashboardService.getClassTitle - /** Populate the querystring with the form info. */ - selectCheckboxResult(column, itemId, event) { - // let el = this.selection.select(column); - event.currentTarget.checked = true; - // this.selection.toggle(column) - const formsArray = Object.values(column.forms); - const selectedForm = formsArray.find(input => (input['formId'] === itemId) ? true : false); - const studentId = column.id; - const classId = column.classId; - const selectedFormId = selectedForm['formId']; - const curriculum = selectedForm['curriculum']; - const src = selectedForm['src']; - const title = selectedForm['title']; - const responseId = selectedForm['response']['_id']; - this.router.navigate(['class-form'], { queryParams: - { formId: selectedFormId, curriculum: curriculum, studentId: studentId, - classId: classId, itemId: selectedFormId, src: src, title: - title, responseId: responseId } - }); - } - - /** Populate the querystring with the form info. */ - async selectCheckbox(column, formId) { - // let el = this.selection.select(row); - // this.selection.toggle(column) - const formsArray = Object.values(column.forms); - // const selectedForm = formsArray.find(response => (response['form']['id'] === formId)); - const studentId = column.id; - const classId = column.classId; - // const selectedFormId = selectedForm['formId']; - const selectedFormId = formId - // const curriculum = selectedForm['curriculum']; - // const src = selectedForm['src']; - // const title = selectedForm['title']; - // let responseId = null; - // const curriculumResponse = await this.dashboardService.getCurriculumResponse(classId, curriculum, studentId) - // if (curriculumResponse) { - // responseId = curriculumResponse._id - // } - - - // this.router.navigate(['class-form'], { queryParams: - // { formId: selectedFormId, - // curriculum: curriculum, - // studentId: studentId, - // classId: classId, - // src: src, - // title: title, - // responseId: responseId } - // }); - } - } diff --git a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html index 1f00bdfce0..5c7f5ea3d9 100644 --- a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html +++ b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.html @@ -13,7 +13,7 @@
- {{'Select a unit to enter scoring for those units.'|translate}} + {{'Select a unit to enter scoring'|translate}}
@@ -25,17 +25,13 @@ {{student["student_name"]}} {{student["student_surname"]}} - - + + -
- -
{{'Scores saved successfully.'|translate}}
-

{{'No Students currently registered.'|translate}}

diff --git a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts index 18e5e15bf2..b2270fa85c 100644 --- a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts +++ b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts @@ -6,7 +6,7 @@ import {DashboardService} from "../../_services/dashboard.service"; import {VariableService} from "../../../shared/_services/variable.service"; import {Router} from "@angular/router"; import {AppConfigService} from "../../../shared/_services/app-config.service"; - +import { TangySnackbarService } from 'src/app/shared/_services/tangy-snackbar.service'; @Component({ selector: 'app-attendance-scores', templateUrl: './attendance-scores.component.html', @@ -47,7 +47,8 @@ export class AttendanceScoresComponent implements OnInit { private dashboardService: DashboardService, private variableService : VariableService, private router: Router, - private appConfigService: AppConfigService + private appConfigService: AppConfigService, + private tangySnackbarService: TangySnackbarService ) { } async ngOnInit(): Promise { @@ -64,7 +65,6 @@ export class AttendanceScoresComponent implements OnInit { } const appConfig = await this.appConfigService.getAppConfig() - const teachConfiguration = appConfig.teachProperties this.units = appConfig.teachProperties?.units const currentClass = this.dashboardService.getSelectedClass(enabledClasses, classIndex) @@ -84,7 +84,6 @@ export class AttendanceScoresComponent implements OnInit { async showScoreListing(currentClass, currentClassId) { const type = "scores" - const registerNameForDialog = 'Scoring'; const students = await this.dashboardService.getMyStudents(currentClassId) const schoolName = this.getValue('school_name', currentClass) const schoolYear = this.getValue('school_year', currentClass) @@ -132,14 +131,9 @@ export class AttendanceScoresComponent implements OnInit { }], complete: false } - // const startRegister = confirm(_TRANSLATE('Begin ' + registerNameForDialog + ' record?')) - // if (startRegister) { - await this.saveStudentScore(null) - // } else { - // this.router.navigate(['/attendance-dashboard/'], { queryParams: - // { curriculum: 'student-registration' } - // }); - // } + + + await this.saveStudentScore() } else { this.showScoreList = true doc.scoreList = this.scoreList @@ -153,36 +147,33 @@ export class AttendanceScoresComponent implements OnInit { student['score_'+unitIndex] = 0 return } - await this.saveStudentScore(student) + await this.saveStudentScore() } - private async saveStudentScore(student) { - console.log('saved student score: ' + JSON.stringify(student)) + private async saveStudentScore() { this.scoreRegister.scoreList = this.scoreList - // update testName in case user updated it. - // this.scoreRegister.testName = this.testName - // save scoreRegister + let doc try { doc = await this.dashboardService.getDoc(this.scoreRegister._id) this.scoreRegister['_rev'] = doc._rev } catch (e) { } + const result = await this.dashboardService.saveDoc(this.scoreRegister) if (result.ok) { this.saveSuccess = true + this.tangySnackbarService.showText(_TRANSLATE('Score saved')) setTimeout(() => { this.saveSuccess = false }, 2000); + } else { + this.tangySnackbarService.showText(_TRANSLATE('Error saving. Please try again.')); } } async saveStudentScores() { - console.log('saved student scores ') this.scoreRegister.scoreList = this.scoreList - // update testName in case user updated it. - // this.scoreRegister.testName = this.testName - // save scoreRegister let doc try { doc = await this.dashboardService.getDoc(this.scoreRegister._id) @@ -200,7 +191,6 @@ export class AttendanceScoresComponent implements OnInit { /** Navigate to the student registration form */ selectStudentName(column) { - const formsArray = Object.values(column.forms); const studentId = column.id; const classId = column.classId; this.router.navigate(['class-form'], { queryParams: @@ -210,8 +200,7 @@ export class AttendanceScoresComponent implements OnInit { getClassTitle = this.dashboardService.getClassTitle - changeCurriculum = async (curriculumId) => { - // this.dashboardService.changeCurriculum(curriculum, this.currArray, this.selectedClass, this.router) + async changeCurriculum(curriculumId) { this.curriculumId = curriculumId await this.variableService.set('class-curriculumId', curriculumId); this.curriculum = this.currArray.find(x => x.name === this.curriculumId); diff --git a/client/src/app/shared/_services/tangy-snackbar.service.ts b/client/src/app/shared/_services/tangy-snackbar.service.ts new file mode 100644 index 0000000000..bd8ff6614d --- /dev/null +++ b/client/src/app/shared/_services/tangy-snackbar.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { _TRANSLATE } from './../translation-marker'; +import { AppConfigService } from './app-config.service'; +import { MatSnackBarConfig } from '@angular/material/snack-bar'; +import { Direction } from '@angular/cdk/bidi'; + +@Injectable() +export class TangySnackbarService { + + constructor( + private snackbar: MatSnackBar, + private appConfigService: AppConfigService + ) { } + public showText(text: string, duration = 2000) { + let config = new MatSnackBarConfig(); + config.direction = (this.appConfigService.config?.languageDirection || 'ltr') as Direction; + config.duration = duration; + this.snackbar.open(text, _TRANSLATE('Close'), config); + } +} diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts index 49866f66b9..a2c62ae658 100755 --- a/client/src/app/shared/shared.module.ts +++ b/client/src/app/shared/shared.module.ts @@ -1,12 +1,14 @@ import { VariableService } from './_services/variable.service'; import { LockBoxService } from './_services/lock-box.service'; +import { AppConfigService } from './_services/app-config.service'; +import { UserService } from './_services/user.service'; +import { TangySnackbarService } from './_services/tangy-snackbar.service'; import { CommonModule } from '@angular/common'; + import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { AppConfigService } from './_services/app-config.service'; -import { UserService } from './_services/user.service'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; import { HttpClientModule, HttpClient } from '@angular/common/http'; - import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; export function HttpClientLoaderFactory(httpClient: HttpClient) { @@ -37,6 +39,7 @@ import { MatButtonModule } from '@angular/material/button'; BrowserAnimationsModule, HttpClientModule, MatTooltipModule, + MatSnackBarModule, MatDialogModule, MatButtonModule, TranslateModule.forRoot({ @@ -50,6 +53,7 @@ import { MatButtonModule } from '@angular/material/button'; providers: [ AppConfigService, UserService, + TangySnackbarService, LockBoxService, VariableService, {provide: DEFAULT_USER_DOCS, useValue:[], multi: true}, diff --git a/translations/translation.en.json b/translations/translation.en.json index 4e753fe396..21bd4f98e2 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -237,7 +237,7 @@ "Searching": "Searching", "Searching...": "Searching...", "Security question is required": "Security question is required", - "Select a unit to enter scoring for those units": "Select a unit to enter scoring for those units", + "Select a unit to enter scoring": "Select a unit to enter scoring", "Select Form Name": "Select Form Name", "Select Report": "Select Report", "Select Student": "Select Student", From affa232f18667e335754cbcc54da2d67f67c4e5e Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 16:09:58 -0500 Subject: [PATCH 13/43] Update CHANGELOG --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b03d00f63a..14eb358365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # What's new +## v3.30.2 + +__New Features__ + +- Customizable 'About' Page on client [#3677](https://github.com/Tangerine-Community/Tangerine/pull/3677) +-- Form developers can create or update a form with the id 'about' +-- The form will appear in the 'About' page on the client + +__General Updates__ +- Password Visibility -- the login and register screen on the client shows an 'eye' icon used to hide or show passwords +- Re-organization of the client app menu + +__Teach Module Updates__ +- Behavior screen show a link instead of a checkbox to access the Behavior form +- Hint text added to attendance, behavior, and scoring tables +- Improved save messaging for attendance and scoring + + +__Server upgrade instructions__ + +Reminder: Consider using the [Tangerine Upgrade Checklist](https://docs.tangerinecentral.org/system-administrator/upgrade-checklist.html) for making sure you test the upgrade safely. + +``` +cd tangerine +# Check the size of the data folder. +du -sh data +# Check disk for free space. +df -h +# If there is not more than 12 GB plus the size of the data folder, create more space before proceeding. +# Good candidates to remove are: data back-up folders and older versions of the Tangerine image +# rm -rf ../data-backup- +# docker rmi tangerine/tangerine: +# Create a backup of the data folder. +cp -r data ../data-backup-$(date "+%F-%T") +# Check logs for the past hour on the server to ensure it's not being actively used. Look for log messages like "Created sync session" for Devices that are syncing and "login success" for users logging in on the server. +docker logs --since=60m tangerine +# Fetch the updates. +git fetch origin +git checkout -b v3.30.1 v3.30.1 +./start.sh v3.30.1 +# Remove Tangerine's previous version Docker Image. +docker rmi tangerine/tangerine: +``` + + + ## v3.30.1 __New Features__ From e2913dad9edf33a988c5b04983a062ee391d8cdd Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 16:29:49 -0500 Subject: [PATCH 14/43] Add about form to all content sets --- CHANGELOG.md | 2 +- .../attendance/client/about/form.html | 40 +++++++++++++++++++ .../client/about/form.html | 40 +++++++++++++++++++ .../case-module/client/about/form.html | 40 +++++++++++++++++++ .../custom-app/client/about/form.html | 40 +++++++++++++++++++ .../client/about/form.html | 40 +++++++++++++++++++ content-sets/default/client/about/form.html | 40 +++++++++++++++++++ 7 files changed, 241 insertions(+), 1 deletion(-) create mode 100755 content-sets/attendance/client/about/form.html create mode 100755 content-sets/case-module-starter/client/about/form.html create mode 100755 content-sets/case-module/client/about/form.html create mode 100755 content-sets/custom-app/client/about/form.html create mode 100755 content-sets/data-conflict-tools/client/about/form.html create mode 100755 content-sets/default/client/about/form.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 14eb358365..1dbe38e4d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ __New Features__ - Customizable 'About' Page on client [#3677](https://github.com/Tangerine-Community/Tangerine/pull/3677) --- Form developers can create or update a form with the id 'about' +-- Form developers can create or update a form with the id 'about'. There is an example form in the [Content Sets]./content-sets` -- The form will appear in the 'About' page on the client __General Updates__ diff --git a/content-sets/attendance/client/about/form.html b/content-sets/attendance/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/attendance/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/case-module-starter/client/about/form.html b/content-sets/case-module-starter/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/case-module-starter/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/case-module/client/about/form.html b/content-sets/case-module/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/case-module/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/custom-app/client/about/form.html b/content-sets/custom-app/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/custom-app/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/data-conflict-tools/client/about/form.html b/content-sets/data-conflict-tools/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/data-conflict-tools/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file diff --git a/content-sets/default/client/about/form.html b/content-sets/default/client/about/form.html new file mode 100755 index 0000000000..7e1111411e --- /dev/null +++ b/content-sets/default/client/about/form.html @@ -0,0 +1,40 @@ + + + +

About Tangerine

+

+ Tangerine is open source software designed for Android mobile devices. Its primary use is to enable + capture of students’ responses in oral reading and mathematics skills assessments as well as interview + responses and field observations. +

+

+ Using Tangerine improves data quality and the efficiency of data collection and analysis. The software + simplifies the preparation and implementation of field work, reduces student assessment times, reduces + measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is + optimized for offline data collection in low-bandwidth environments and features powerful sync and data + backup options. +

+

+ Tangerine was developed by RTI International starting in + 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using + latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the + public through an open-source GNU General Public License. You can host it on your own server and modify + its code as needed. The only requirement is that if you share your modified version publicly, you also + need to share the modified source code with the larger community. +

+

+ Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. + While originally developed for education, Tangerine is increasingly used also for interviews and field + observations in the health, governance, and agricultural sectors. +

+

+ For more information on Tangerine see http://www.tangerinecentral.org. +

+

+ For questions about Tangerine, contact support@tangerinehelp.zendesk.com. +

+
+
+
\ No newline at end of file From 88fc85a68f198164962fe16c726b489fc81b8a7d Mon Sep 17 00:00:00 2001 From: esurface Date: Fri, 15 Dec 2023 16:30:55 -0500 Subject: [PATCH 15/43] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dbe38e4d7..044146eb57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ __New Features__ - Customizable 'About' Page on client [#3677](https://github.com/Tangerine-Community/Tangerine/pull/3677) --- Form developers can create or update a form with the id 'about'. There is an example form in the [Content Sets]./content-sets` +-- Form developers can create or update a form with the id 'about'. There is an example form in the [Content Sets](https://github.com/Tangerine-Community/Tangerine/tree/release/v3.30.2/content-sets/default/client/about) -- The form will appear in the 'About' page on the client __General Updates__ From 6138fd42ca2ac3f01143b2d9c8c35ab762f41970 Mon Sep 17 00:00:00 2001 From: esurface Date: Mon, 18 Dec 2023 10:25:58 -0500 Subject: [PATCH 16/43] Clean up default about form in content sets --- .../attendance/client/about/form.html | 94 +++++++++++-------- .../client/about/form.html | 94 +++++++++++-------- .../case-module/client/about/form.html | 94 +++++++++++-------- .../custom-app/client/about/form.html | 94 +++++++++++-------- content-sets/default/client/about/form.html | 94 +++++++++++-------- content-sets/teach/client/about/form.html | 94 +++++++++++-------- 6 files changed, 336 insertions(+), 228 deletions(-) diff --git a/content-sets/attendance/client/about/form.html b/content-sets/attendance/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/attendance/client/about/form.html +++ b/content-sets/attendance/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file diff --git a/content-sets/case-module-starter/client/about/form.html b/content-sets/case-module-starter/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/case-module-starter/client/about/form.html +++ b/content-sets/case-module-starter/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file diff --git a/content-sets/case-module/client/about/form.html b/content-sets/case-module/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/case-module/client/about/form.html +++ b/content-sets/case-module/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file diff --git a/content-sets/custom-app/client/about/form.html b/content-sets/custom-app/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/custom-app/client/about/form.html +++ b/content-sets/custom-app/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file diff --git a/content-sets/default/client/about/form.html b/content-sets/default/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/default/client/about/form.html +++ b/content-sets/default/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file diff --git a/content-sets/teach/client/about/form.html b/content-sets/teach/client/about/form.html index 7e1111411e..62667c0fea 100755 --- a/content-sets/teach/client/about/form.html +++ b/content-sets/teach/client/about/form.html @@ -1,40 +1,58 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
+ + + \ No newline at end of file From f67057727b3222cbeca8130cf349602fda96c05d Mon Sep 17 00:00:00 2001 From: esurface Date: Mon, 18 Dec 2023 11:48:13 -0500 Subject: [PATCH 17/43] Fix dereference in attendance dashboard preventing stud. reg. from showing --- .../attendance-dashboard/attendance-dashboard.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts index 50c1176c0e..496c3398c2 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts @@ -248,7 +248,6 @@ export class AttendanceDashboardComponent implements OnInit { /** Navigate to the student registration form */ selectStudentName(column) { - const formsArray = Object.values(column.forms); const studentId = column.id; const classId = column.classId; this.router.navigate(['class-form'], { queryParams: From 7e5e06b2dcf904097384dac10215ae654441d78b Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 19 Dec 2023 15:34:50 -0500 Subject: [PATCH 18/43] Add Custom Date Range selection in Attendance report --- client/src/app/class/class.module.ts | 4 + .../attendance/attendance.component.css | 17 +++- .../attendance/attendance.component.html | 56 ++++++------ .../attendance/attendance.component.ts | 88 ++++++++++++------- .../app/shared/_services/languages.service.ts | 11 ++- .../_services/tangy-date-adapter.service.ts | 27 ++++++ client/src/app/shared/shared.module.ts | 6 +- translations/translation.en.json | 9 ++ 8 files changed, 151 insertions(+), 67 deletions(-) create mode 100644 client/src/app/shared/_services/tangy-date-adapter.service.ts diff --git a/client/src/app/class/class.module.ts b/client/src/app/class/class.module.ts index 049895f2ea..6660f79fc1 100644 --- a/client/src/app/class/class.module.ts +++ b/client/src/app/class/class.module.ts @@ -11,6 +11,8 @@ import {MatListModule} from '@angular/material/list'; import {MatMenuModule} from '@angular/material/menu'; import {MatPaginatorIntl} from '@angular/material/paginator'; import {MatSelectModule} from '@angular/material/select'; +import {MatDatepickerModule} from '@angular/material/datepicker'; +import {MatNativeDateModule} from '@angular/material/core'; import {MatTableModule} from '@angular/material/table'; import {MatTabsModule} from '@angular/material/tabs'; import {MatToolbarModule} from '@angular/material/toolbar'; @@ -69,6 +71,8 @@ registerLocaleData(localeEsGt); MatCardModule, CdkTableModule, MatTableModule, + MatDatepickerModule, + MatNativeDateModule, MatSelectModule, MatCheckboxModule, MatPaginatorModule, diff --git a/client/src/app/class/reports/attendance/attendance.component.css b/client/src/app/class/reports/attendance/attendance.component.css index 9c435afc6b..fe7f437068 100644 --- a/client/src/app/class/reports/attendance/attendance.component.css +++ b/client/src/app/class/reports/attendance/attendance.component.css @@ -20,12 +20,23 @@ #last-n-report { margin-top: 1em; } -mat-form-field { - width: 35px; -} #last-n-report { margin-top: 30px } + +.date-select-form { + margin-left: 30px; + display: flex; + align-items: center; + justify-content: space-between; + width: 450px; +} + +.date-select-form-fields { + display: flex; + align-items: flex-start; +} + .legend td { padding: 0 1em; } diff --git a/client/src/app/class/reports/attendance/attendance.component.html b/client/src/app/class/reports/attendance/attendance.component.html index e0826c1286..7da558444c 100644 --- a/client/src/app/class/reports/attendance/attendance.component.html +++ b/client/src/app/class/reports/attendance/attendance.component.html @@ -2,7 +2,8 @@
{{'Report'|translate}}
{{getClassTitle(selectedClass)}} : {{curriculum?.label}}
- {{'Scroll to the right to view the results for subjects and units. See more at'|translate}} ⇨ + {{'Scroll to the right to view the results for subjects and units'|translate}} + arrow_right_alt
@@ -39,7 +40,7 @@

{{'Most Recent Class'|translate}}

- {{student["name"]}} {{student["surname"]}} + {{student["student_name"]}} {{student["student_surname"]}}
-

{{'Most recent'|translate}} {{numVisits}} {{'visits'|translate}}

+

{{'Custom Date Range Report'|translate}}

+

{{'Select a start and end date to view report for that period'|translate}}

- + + + {{'Start Date'|translate}} + + + + + + + {{'End Date'|translate}} + + + + + +
- - - - - -
- {{'View reports from the last:'|translate}} - -
- - - -
-
- {{'days'|translate}} -
- - @@ -166,10 +164,8 @@

{{'Most recent'|translate}} {{numVisits}} {{'visits'|translate}}

- - - - + + - - - +
{{'Stud.'|translate}} {{'Attend.'|translate}} {{'Behav.'|translate}}
{{student["name"]}} {{student["surname"]}}
{{student["student_name"]}} {{student["student_surname"]}}

{{'Unit Report'|translate}}

-

{{'Click unit to view report for that period:'|translate}}

+

{{'Select a unit to view report for that period'|translate}}

@@ -291,9 +287,7 @@

{{unitReport?.name}}

{{student["name"]}} {{student["surname"]}} {{student["student_name"]}} {{student["student_surname"]}} , ) { } @@ -37,11 +44,20 @@ export class AttendanceComponent implements OnInit { scoreReports: any[] attendanceReport: any scoreReport: any - recentVisitsReport: any + dateRangeReport: any unitReport: any - // @ViewChild('numVisits', {static: true}) searchResults: ElementRef - // @Input() numVisits!: number | string - numVisits = 5 + + @ViewChild("startDate") rangeStartDatePicker: MatDatepicker; + rangeMaxDate: Date = new Date(); + rangeStartDate:Date; + rangeEndDate:Date = new Date(); + locale: string = 'en-US'; + + beforeEndDateFilter = (d: Date | null): boolean => { + // Prevent Saturday and Sunday from being selected. + return DateTime.fromJSDate(d) <= DateTime.fromJSDate(this.rangeEndDate); + }; + classId: string; curriculi: any; curriculumName: string; @@ -75,6 +91,12 @@ export class AttendanceComponent implements OnInit { this.classId = classId this.classUtils = new ClassUtils(); + const languageCode = await this.variableService.get('languageCode') + this.locale = languageCode.replace('_', '-'); + Settings.defaultLocale = this.locale + + this.dateAdapter.setLocale(this.locale); + const appConfig = await this.appConfigService.getAppConfig() const teachConfiguration = appConfig.teachProperties this.units = appConfig.teachProperties?.units @@ -94,6 +116,11 @@ export class AttendanceComponent implements OnInit { unitDate.startDate = startDate unitDate.endDate = endDate }) + + // maybe make this relative to the selected date for the single day report table + this.rangeStartDate = DateTime.now().minus({months: 1}).toJSDate(); + this.rangeEndDate = DateTime.now().toJSDate(); + this.attendancePrimaryThreshold = appConfig.teachProperties?.attendancePrimaryThreshold this.attendanceSecondaryThreshold = appConfig.teachProperties?.attendanceSecondaryThreshold this.scoringPrimaryThreshold = appConfig.teachProperties?.scoringPrimaryThreshold @@ -140,15 +167,11 @@ export class AttendanceComponent implements OnInit { // await this.onCurriculumSelect(curriculum.name) // } - // const { attendanceReports, currentAttendanceReport } = await this.generateSummaryReport(currArray, curriculumId, currentClass, classId); - this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, null, this.currentIndex, null, null); - // this.attendanceReport = currentAttendanceReport - // const mostRecentAttendanceReport = attendanceReports.slice(0 - parseInt(this.numVisits, 10)) - // this.recentVisitsReport = await this.dashboardService.getRecentVisitsReport(mostRecentAttendanceReport) - this.recentVisitsReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.numVisits, this.currentIndex, null, null); + this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, null, null); + this.dateRangeReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, null, null); } - private async generateSummaryReport(currArray, curriculum, currentClass, classId: string, numVisits: number, currentIndex: number = 0, startDate: string, endDate: string) { + private async generateSummaryReport(currArray, curriculum, currentClass, classId: string, currentIndex: number = 0, startDate: string, endDate: string) { // this.curriculum = currArray.find(x => x.name === curriculumId); let curriculumLabel = curriculum?.label // Set the curriculumLabel to null if ignoreCurriculumsForTracking is true. @@ -194,8 +217,8 @@ export class AttendanceComponent implements OnInit { let scoreReport = currentScoreReport - if (numVisits) { - const selectedAttendanceReports = attendanceReports.slice(0,numVisits) + if (startDate && endDate) { + const selectedAttendanceReports = attendanceReports for (let i = 0; i < selectedAttendanceReports.length; i++) { const attendanceReport = selectedAttendanceReports[i]; const attendanceList = attendanceReport.doc.attendanceList @@ -210,8 +233,8 @@ export class AttendanceComponent implements OnInit { const behaviorList = currentBehaviorReport?.studentBehaviorList // await this.dashboardService.processBehaviorReport(behaviorList, register) - if (numVisits) { - const selectedBehaviorReports = behaviorReports.slice(0 - numVisits) + if (startDate && endDate) { + const selectedBehaviorReports = behaviorReports for (let i = 0; i < selectedBehaviorReports.length; i++) { const attendanceReport = selectedBehaviorReports[i]; const studentBehaviorList = attendanceReport.doc.studentBehaviorList @@ -236,7 +259,6 @@ export class AttendanceComponent implements OnInit { this.dashboardService.processScoreReport(scoreReport, student, this.units, ignoreCurriculumsForTracking, student, curriculum); } } - // return {attendanceReports, currentAttendanceReport}; return register } @@ -244,15 +266,21 @@ export class AttendanceComponent implements OnInit { return await this.userService.getUserDatabase(); } + async onRangeDateChange(id:string, event: any) { + if (id === 'rangeEndDateInput') { + this.rangeEndDate = new Date(event.value) + } else if (id === 'rangeStartDateInput') { + this.rangeStartDate = new Date(event.value) + } + + let mostRecentDate = DateTime.fromJSDate(this.rangeEndDate) + let previousDate = DateTime.fromJSDate(this.rangeStartDate) - async onNumberVisitsChange(event: any) { - console.log('onNumberVisitsChange', event) - console.log('numVisits: ', this.numVisits) - if (this.numVisits) { - // const mostRecentAttendanceReport = this.attendanceReports.slice(0 - parseInt(this.numVisits, 10)) - // const mostRecentAttendanceReport = this.attendanceReports.slice(0 - this.numVisits) - // this.recentVisitsReport = await this.dashboardService.getRecentVisitsReport(mostRecentAttendanceReport) - this.recentVisitsReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.numVisits, this.currentIndex, null, null); + if (previousDate <= mostRecentDate) { + this.dateRangeReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, + mostRecentDate.toISODate(), previousDate.toISODate()); + } else { + this.rangeStartDatePicker.open(); } } @@ -263,7 +291,7 @@ export class AttendanceComponent implements OnInit { const reportName = unitDate.name const dateRange = unitDate.startLocaltime + ' - ' + unitDate.endLocaltime // Since we are querying backwards, we reverse startDate and endDate - this.unitReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.numVisits, this.currentIndex, endDate, startDate); + this.unitReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, endDate, startDate); this.unitReport.name = reportName this.unitReport.dateRange = dateRange setTimeout(() => { @@ -295,7 +323,6 @@ export class AttendanceComponent implements OnInit { /** Navigate to the student registration form */ selectStudentName(column) { - const formsArray = Object.values(column.forms); const studentId = column.id; const classId = column.classId; this.router.navigate(['class-form'], { queryParams: @@ -304,7 +331,6 @@ export class AttendanceComponent implements OnInit { } selectStudentDetails(student) { - console.log("selectStudentDetails: ", student) student.ignoreCurriculumsForTracking = this.ignoreCurriculumsForTracking const studentId = student.id; const classId = student.classId; @@ -325,13 +351,13 @@ export class AttendanceComponent implements OnInit { const updatedIndex = this.currentIndex + 1 this.setBackButton(updatedIndex) this.currentIndex = updatedIndex - this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, null, this.currentIndex, null, null); + this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, null, null); } async goForward() { const updatedIndex = this.currentIndex - 1 this.setForwardButton(updatedIndex); this.currentIndex = updatedIndex - this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, null, this.currentIndex, null, null); + this.attendanceReport = await this.generateSummaryReport(this.currArray, this.curriculum, this.selectedClass, this.classId, this.currentIndex, null, null); } private setBackButton(updatedIndex) { diff --git a/client/src/app/shared/_services/languages.service.ts b/client/src/app/shared/_services/languages.service.ts index 6940ed3068..8f2055fa71 100644 --- a/client/src/app/shared/_services/languages.service.ts +++ b/client/src/app/shared/_services/languages.service.ts @@ -8,7 +8,8 @@ class LanguageInfo { languageDirection:string } -const LANGUAGE_CODE = 'languageCode' +const LANGUAGE_CODE = 'languageCode' // This is used to load the translation files by name like 'en_us.json' +const LANGUAGE_LOCALE = 'languageLocale' // This is the properly formatted locale like 'en-US' const LANGUAGE_DIRECTION = 'languageDirection' const USER_HAS_SET_LANGUAGE = 'userHasSetLanguage' @@ -25,12 +26,14 @@ export class LanguagesService { async install() { const language = (await this.list())[0] await this.variableService.set(LANGUAGE_CODE, language.languageCode) + await this.variableService.set(LANGUAGE_LOCALE, language.languageCode.replace('_', '-')); await this.variableService.set(LANGUAGE_DIRECTION, language.languageDirection) await this.variableService.set(USER_HAS_SET_LANGUAGE, 'false') } async uninstall() { await this.variableService.set(LANGUAGE_CODE, null) + await this.variableService.set(LANGUAGE_LOCALE, null) await this.variableService.set(LANGUAGE_DIRECTION, null) await this.variableService.set(USER_HAS_SET_LANGUAGE, null) } @@ -39,12 +42,18 @@ export class LanguagesService { return >await this.http.get('./assets/translations.json').toPromise(); } + // Use this to get the current language code for loading translation files async getCurrentLanguage() { const languageCode = await this.variableService.get(LANGUAGE_CODE) const language = (await this.list()).find(languageInfo => languageInfo.languageCode === languageCode) return language } + // Use this to get the current language locale for formatting dates and numbers + async getCurrentLanguageLocale() { + return await this.variableService.get(LANGUAGE_LOCALE); + } + async setLanguage(languageCode, userHasSetLanguage = false) { const language = (await this.list()).find(languageInfo => languageInfo.languageCode === languageCode) await this.variableService.set(LANGUAGE_CODE, language.languageCode) diff --git a/client/src/app/shared/_services/tangy-date-adapter.service.ts b/client/src/app/shared/_services/tangy-date-adapter.service.ts new file mode 100644 index 0000000000..f356b0cdb8 --- /dev/null +++ b/client/src/app/shared/_services/tangy-date-adapter.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { NativeDateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; +import { Platform, PlatformModule } from '@angular/cdk/platform'; +import { LanguagesService } from './languages.service'; + +@Injectable({ + providedIn: 'root' +}) +export class TangyDateAdapterService extends NativeDateAdapter { + + constructor( + private languagesService: LanguagesService + ) { + super('en-US', new Platform); + + this.languagesService.getCurrentLanguageLocale().then(locale => { + this.setLocale(locale); + }); + } + + getFirstDayOfWeek(): number { + if (this.locale != 'en') { + return 1; // Monday + } + return 0; // Sunday + } +} \ No newline at end of file diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts index a2c62ae658..b20e03c312 100755 --- a/client/src/app/shared/shared.module.ts +++ b/client/src/app/shared/shared.module.ts @@ -8,6 +8,7 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatNativeDateModule, DateAdapter } from '@angular/material/core'; import { HttpClientModule, HttpClient } from '@angular/common/http'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; @@ -31,6 +32,7 @@ import { MatDialogModule } from '@angular/material/dialog'; import { ProcessMonitorDialogComponent } from './_components/process-monitor-dialog/process-monitor-dialog.component'; import { ProcessMonitorService } from './_services/process-monitor.service'; import { MatButtonModule } from '@angular/material/button'; +import { TangyDateAdapterService } from './_services/tangy-date-adapter.service'; @NgModule({ schemas: [ CUSTOM_ELEMENTS_SCHEMA ], @@ -42,6 +44,7 @@ import { MatButtonModule } from '@angular/material/button'; MatSnackBarModule, MatDialogModule, MatButtonModule, + MatNativeDateModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, @@ -61,7 +64,8 @@ import { MatButtonModule } from '@angular/material/button'; SearchService, FormTypesService, ProcessMonitorService, - CreateProfileGuardService + CreateProfileGuardService, + { provide: DateAdapter, useClass: TangyDateAdapterService }, ], declarations: [ UnsanitizeHtmlPipe, diff --git a/translations/translation.en.json b/translations/translation.en.json index 14451386d1..56c73173bb 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -62,7 +62,9 @@ "Creating new case...": "Creating new case...", "Current": "Current", "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "DATA QUERIES", + "Date": "Date", "Date and Time": "Date and Time", "Day": "Day", "Day View": "Day View", @@ -81,6 +83,7 @@ "Edit Item": "Edit Item", "Email": "Email", "Enter your response to above question here": "Enter your response to above question here", + "End Date": "End Date", "Error Downloading File": "Error Downloading File", "Error restoring db ": "Error restoring db ", "Event": "Event", @@ -147,6 +150,7 @@ "May": "May", "Mediocre": "Mediocre", "Meters": "Meters", + "Most Recent Class": "Most Recent Class", "Month": "Month", "My Forms": "My Forms", "Name": "Name", @@ -215,6 +219,7 @@ "Release PWA to Production": "Release PWA to Production", "Release PWA to QA": "Release PWA to QA", "Reports": "Reports", + "Report": "Report", "Response": "Response", "Restore Backup": "Restore Backup", "Results": "Results", @@ -231,6 +236,9 @@ "Scan Code": "Scan Code", "School": "School", "Score": "Score", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Screening ID": "Screening ID", "Search cases": "Search cases", "Searching": "Searching", @@ -252,6 +260,7 @@ "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Start", + "Start Date": "Start Date", "Start Time": "Start Time", "Status": "Status", "Status.Concerning": "Status.Concerning", From 83e3329a70c4c26ec8df5c8c510bb2a627c89b15 Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 19 Dec 2023 15:38:58 -0500 Subject: [PATCH 19/43] Add translation --- translations/translation.en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/translations/translation.en.json b/translations/translation.en.json index 56c73173bb..6c1d0543d1 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -318,6 +318,7 @@ "Try standing next to a window": "Try standing next to a window", "Unable to check for update. Make sure you are connected to the Internet and try again.": "Unable to check for update. Make sure you are connected to the Internet and try again.", "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", "Unknown": "Unknown", "Update App": "Update App", "Update is Running. Please Wait ...": "Update is Running. Please Wait ...", From 9972feaf0da6a16f5b9c4913cb25daea2397f582 Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 19 Dec 2023 16:06:37 -0500 Subject: [PATCH 20/43] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 044146eb57..594d047aaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ __Teach Module Updates__ - Behavior screen show a link instead of a checkbox to access the Behavior form - Hint text added to attendance, behavior, and scoring tables - Improved save messaging for attendance and scoring +- In Attendance Reports: + - add start and end dates to view a custom date range report + - Fix the names not displaying in the tables __Server upgrade instructions__ From df47d34cf7486e72fe9306db9338c127c34791d5 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 20 Dec 2023 10:30:21 -0500 Subject: [PATCH 21/43] Test cordova socialshare plugin options --- .../attendance-dashboard.component.ts | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts index 496c3398c2..846220e5b3 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts @@ -30,7 +30,6 @@ export class AttendanceDashboardComponent implements OnInit { curriculum: any; units: string[] = [] ignoreCurriculumsForTracking: boolean = false - enableContactChoosing: boolean = false reportLocaltime: string; currArray: any[] enabledClasses: any[] @@ -217,13 +216,12 @@ export class AttendanceDashboardComponent implements OnInit { // sms.send(phone, message, options, success, error); let options = { - // message: _TRANSLATE('Share this '), // not supported on some apps (Facebook, Instagram) message: message, // not supported on some apps (Facebook, Instagram) subject: _TRANSLATE('Student feedback '), // fi. for email chooserTitle: _TRANSLATE('Pick an app '), // Android only, you can override the default share sheet title phone: phone, // phone number to share (for WhatsApp only) - number: phone, // phone number to share (for WhatsApp only) unused. delete. - appPackageName: 'com.whatsapp' // Android only, you can provide id of the App you want to share with + // number: phone, // phone number to share (for WhatsApp only) unused. delete. + // appPackageName: 'com.whatsapp' // Android only, you can provide id of the App you want to share with }; const onSuccess = (result) => { @@ -235,11 +233,8 @@ export class AttendanceDashboardComponent implements OnInit { console.log("Sharing failed with message: " + msg); alert( _TRANSLATE('Sharing failed: WhatsApp may not be installed. The following apps are available for sharing: ') + msg); }; - if (this.enableContactChoosing) { - this.window.plugins.socialsharing.shareWithOptions(options, onSuccess, onError); - } else { - this.window.plugins.socialsharing.shareViaWhatsAppToPhone(phone, message, null /* img */, null /* url */, onSuccess, onError) - } + this.window.plugins.socialsharing.shareWithOptions(options, onSuccess, onError); + } } else { alert(_TRANSLATE('This feature is only available on a mobile device.')) @@ -257,8 +252,4 @@ export class AttendanceDashboardComponent implements OnInit { getClassTitle = this.dashboardService.getClassTitle - setEnableContactChoosing(checked: boolean) { - this.enableContactChoosing = checked - } - } From 8d889765629211a4cd22f5df8faa034db7b412d2 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 20 Dec 2023 12:58:14 -0500 Subject: [PATCH 22/43] Update translations --- translations/translation.en.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/translations/translation.en.json b/translations/translation.en.json index 6c1d0543d1..4d1448e6de 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -63,6 +63,7 @@ "Current": "Current", "Curriculum": "Curriculum", "Custom Date Range Report": "Custom Date Range Report", + "Dashboard": "Dashboard", "DATA QUERIES": "DATA QUERIES", "Date": "Date", "Date and Time": "Date and Time", @@ -236,6 +237,7 @@ "Scan Code": "Scan Code", "School": "School", "Score": "Score", + "Score saved": "Score saved", "Select a unit to view report for that period": "Select a unit to view report for that period", "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", From ac91f2ad9d0e5b98291a262aefbfc89e29d326ab Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 20 Dec 2023 12:58:37 -0500 Subject: [PATCH 23/43] Add content-sets/content-sets.json to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b92478383d..8d0eed448e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ tanerine-env-vars.sh .history certs +content-sets/content-sets.json translations/*.csv tangerine-preview/app/ From f944f225e9570c72b833c2b5002d57e7426f1d25 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 20 Dec 2023 14:19:24 -0500 Subject: [PATCH 24/43] Add button for whatsapp message to attendance dashboard and fix messages --- client/angular.json | 3 +- client/package.json | 1 + .../attendance-dashboard.component.html | 10 +- .../attendance-dashboard.component.ts | 122 +++++++++--------- translations/translation.en.json | 1 + 5 files changed, 71 insertions(+), 66 deletions(-) diff --git a/client/angular.json b/client/angular.json index 0e3f07f633..c04f39b4dd 100644 --- a/client/angular.json +++ b/client/angular.json @@ -34,7 +34,8 @@ "src/assets" ], "styles": [ - "src/styles.scss" + "src/styles.scss", + "node_modules/font-awesome/css/font-awesome.css" ] }, "configurations": { diff --git a/client/package.json b/client/package.json index eb2f755ca1..f2093ac35f 100644 --- a/client/package.json +++ b/client/package.json @@ -52,6 +52,7 @@ "date-carousel": "^5.2.1", "date-fns": "^2.30.0", "fast-json-patch": "^3.0.0-1", + "font-awesome": "^4.7.0", "fs-extra": "^6.0.1", "install": "^0.13.0", "js-uuid": "0.0.6", diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html index a11d34495e..3c7a838c3b 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html @@ -15,7 +15,7 @@
- + @@ -26,11 +26,17 @@ + - + @@ -84,7 +84,6 @@ 'white' : student['scores'] && (student['scores'][curriculum.labelSafe] === null || student['scores'][curriculum.labelSafe] === undefined), 'number-cell': true, 'centered': true}"> - {{student['scores'][curriculum.labelSafe]}}% diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts index c7e16823a2..bdba32d9cb 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts @@ -186,25 +186,23 @@ export class AttendanceDashboardComponent implements OnInit { messageList.push(behaviorMessage) } - let scoresMessage = ""; if (!this.ignoreCurriculumsForTracking) { - scoresMessage = _TRANSLATE('Score average is: ') + student.score + "%" - messageList.push(scoresMessage) + if (student.score) { + let scoresMessage = _TRANSLATE('Score average is: ') + student.score + "%" + messageList.push(scoresMessage) + } } else { - for (let i = 0; i < this.currArray.length; i++) { - const curriculum = this.currArray[i]; - let curriculumLabel = curriculum?.label - if (student.scores) { - if (student.scores[curriculumLabel]) { - if (i == 0) { - scoresMessage = _TRANSLATE('Score average is: ') - messageList.push(scoresMessage) - } - messageList.push(curriculumLabel + ": " + student.scores[curriculumLabel] + "%") + if (student.scores) { + let scoresMessage = _TRANSLATE('Subject Scores') + ":"; + messageList.push(scoresMessage) + Object.entries(student.scores).forEach((label, score) => { + const curriculum = this.currArray.find(c => c.labelSafe == label) + if (curriculum && curriculum.label) { + messageList.push(curriculum.label + ": " + score + "%") } - } + }) } - } + } const fullMessage = messageList.join("\n") diff --git a/client/src/app/class/reports/attendance/attendance.component.html b/client/src/app/class/reports/attendance/attendance.component.html index 7da558444c..5f9286b652 100644 --- a/client/src/app/class/reports/attendance/attendance.component.html +++ b/client/src/app/class/reports/attendance/attendance.component.html @@ -17,7 +17,7 @@

{{'Most Recent Class'|translate}}

- + @@ -142,7 +142,7 @@

{{'Custom Date Range Report'|translate}}

- + @@ -264,7 +264,7 @@

{{unitReport?.name}}

- + From 7fb2f34ddd27e101e91c3c6bcab2b5b11f67fe9a Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 4 Jan 2024 14:51:07 -0500 Subject: [PATCH 26/43] Remove html comment from about form --- content-sets/attendance/client/about/form.html | 2 +- content-sets/case-module-starter/client/about/form.html | 2 +- content-sets/case-module/client/about/form.html | 2 +- content-sets/custom-app/client/about/form.html | 2 +- content-sets/default/client/about/form.html | 2 +- content-sets/teach/client/about/form.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content-sets/attendance/client/about/form.html b/content-sets/attendance/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/attendance/client/about/form.html +++ b/content-sets/attendance/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + diff --git a/content-sets/case-module-starter/client/about/form.html b/content-sets/case-module-starter/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/case-module-starter/client/about/form.html +++ b/content-sets/case-module-starter/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + diff --git a/content-sets/case-module/client/about/form.html b/content-sets/case-module/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/case-module/client/about/form.html +++ b/content-sets/case-module/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + diff --git a/content-sets/custom-app/client/about/form.html b/content-sets/custom-app/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/custom-app/client/about/form.html +++ b/content-sets/custom-app/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + diff --git a/content-sets/default/client/about/form.html b/content-sets/default/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/default/client/about/form.html +++ b/content-sets/default/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + diff --git a/content-sets/teach/client/about/form.html b/content-sets/teach/client/about/form.html index 62667c0fea..4d8fcb24b8 100755 --- a/content-sets/teach/client/about/form.html +++ b/content-sets/teach/client/about/form.html @@ -49,7 +49,7 @@

About Tangerine

- + From c2ab3fcbd9193b13bb09b15d9ae445c106a3b9dc Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 4 Jan 2024 15:03:13 -0500 Subject: [PATCH 27/43] Fix scores and translations in sms and whatsapp message --- .../attendance-dashboard.component.ts | 17 ++++++++++------- .../behavior-check/behavior-check.component.ts | 1 - translations/translation.en.json | 7 +++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts index bdba32d9cb..02b198710c 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts @@ -175,27 +175,29 @@ export class AttendanceDashboardComponent implements OnInit { messageList.push(message) if (student.presentPercentage) { - let attendanceMessage = _TRANSLATE('Attendance is: ') + student.presentPercentage + '%' + let attendanceMessage = _TRANSLATE('Attendance') + ':' + student.presentPercentage + '%' messageList.push(attendanceMessage) } let behaviorMessage = "" if (student.behaviorPercentage) { - behaviorMessage = _TRANSLATE('Behaviour is: ') + student.behaviorPercentage + '%' + behaviorMessage = _TRANSLATE('Behaviour') + ':' + student.behaviorPercentage + '%' messageList.push(behaviorMessage) } if (!this.ignoreCurriculumsForTracking) { if (student.score) { - let scoresMessage = _TRANSLATE('Score average is: ') + student.score + "%" + let scoresMessage = _TRANSLATE('Score average') + ':' + student.score + '%' messageList.push(scoresMessage) } } else { if (student.scores) { - let scoresMessage = _TRANSLATE('Subject Scores') + ":"; + let scoresMessage = _TRANSLATE('Subject scores') + ':'; messageList.push(scoresMessage) - Object.entries(student.scores).forEach((label, score) => { + Object.entries(student.scores).forEach((scoreArr, _) => { + const label = scoreArr[0]; + const score = scoreArr[1]; const curriculum = this.currArray.find(c => c.labelSafe == label) if (curriculum && curriculum.label) { messageList.push(curriculum.label + ": " + score + "%") @@ -210,13 +212,14 @@ export class AttendanceDashboardComponent implements OnInit { console.log("Shared to app: " + result); }; const onError = (msg) => { - alert( _TRANSLATE('Sharing failed: WhatsApp may not be installed. The following apps are available for sharing: ') + msg); + console.log("Sharing failed with message: " + msg) + alert( _TRANSLATE('Something went wrong, please try again.')); }; // options are only used in shareViaSMS and shareWithOptions let options = { message: fullMessage, - subject: _TRANSLATE('Student feedback'), + subject: _TRANSLATE('Student Report'), phone: phone }; diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts index c3cae91118..d0f928125d 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts @@ -156,7 +156,6 @@ export class BehaviorCheckComponent implements OnInit { } private async saveStudentBehavior(student) { - console.log('saving student behavior. ') // save allStudentResults this.register.studentBehaviorList = this.studentBehaviorList // save register diff --git a/translations/translation.en.json b/translations/translation.en.json index 475e309e68..eb0716f725 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -19,12 +19,14 @@ "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "Are you sure you want to start a form response?", "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attendance": "Attendance", "August": "August", "Average": "Average", "Average Correct": "Average Correct", "Average Correct (%)": "Average Correct (%)", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Case", "Cases": "Cases", @@ -221,6 +223,7 @@ "Release PWA to QA": "Release PWA to QA", "Reports": "Reports", "Report": "Report", + "Report for": "Report for", "Response": "Response", "Restore Backup": "Restore Backup", "Results": "Results", @@ -237,6 +240,7 @@ "Scan Code": "Scan Code", "School": "School", "Score": "Score", + "Score average": "Score average", "Score saved": "Score saved", "Select a unit to view report for that period": "Select a unit to view report for that period", "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", @@ -259,6 +263,7 @@ "September": "September", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Settings", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Start", @@ -272,10 +277,12 @@ "Student": "Student", "Student Dashboard": "Student Dashboard", "Student Grouping": "Student Grouping", + "Student Report": "Student Report", "Student Subtest Report": "Student Subtest Report", "Students Assessed": "Students Assessed", "Students to watch": "Students to watch", "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", "Submit": "Submit", "Submitting...": "Submitting...", "Subtask": "Subtask", From b814a4473c1b28d16424ab844908a5c238afbd11 Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 4 Jan 2024 15:24:04 -0500 Subject: [PATCH 28/43] Update CHANGELOG --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 594d047aaa..2f0b0dbeed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,9 @@ __Teach Module Updates__ - add start and end dates to view a custom date range report - Fix the names not displaying in the tables +__Fixes__ +- [#3583](https://github.com/Tangerine-Community/Tangerine/issues/3583) + __Server upgrade instructions__ @@ -42,7 +45,7 @@ docker logs --since=60m tangerine # Fetch the updates. git fetch origin git checkout -b v3.30.1 v3.30.1 -./start.sh v3.30.1 +./start.sh v3.30.2 # Remove Tangerine's previous version Docker Image. docker rmi tangerine/tangerine: ``` From 5d9a9d9688ee48643bd8328ec46cc097f0c9bdef Mon Sep 17 00:00:00 2001 From: Lachezar Hristov Date: Fri, 5 Jan 2024 09:59:08 +0100 Subject: [PATCH 29/43] Update script plus improved About page in all content sets Update script is also part of changelog --- CHANGELOG.md | 2 + .../attendance/client/about/form.html | 130 ++++++++++-------- .../client/about/form.html | 130 ++++++++++-------- .../case-module/client/about/form.html | 130 ++++++++++-------- .../custom-app/client/about/form.html | 130 ++++++++++-------- .../client/about/form.html | 118 ++++++++++------ content-sets/default/client/about/form.html | 130 ++++++++++-------- content-sets/teach/client/about/form.html | 130 ++++++++++-------- server/src/upgrade/v3.30.2.js | 49 +++++++ 9 files changed, 579 insertions(+), 370 deletions(-) create mode 100755 server/src/upgrade/v3.30.2.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f0b0dbeed..9030243ee5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ docker logs --since=60m tangerine git fetch origin git checkout -b v3.30.1 v3.30.1 ./start.sh v3.30.2 +# Run the update to copy the new About page to all groups on your site. +docker exec -it tangerine /tangerine/server/src/upgrade/v3.30.2.js # Remove Tangerine's previous version Docker Image. docker rmi tangerine/tangerine: ``` diff --git a/content-sets/attendance/client/about/form.html b/content-sets/attendance/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/attendance/client/about/form.html +++ b/content-sets/attendance/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/content-sets/case-module-starter/client/about/form.html b/content-sets/case-module-starter/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/case-module-starter/client/about/form.html +++ b/content-sets/case-module-starter/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/content-sets/case-module/client/about/form.html b/content-sets/case-module/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/case-module/client/about/form.html +++ b/content-sets/case-module/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/content-sets/custom-app/client/about/form.html b/content-sets/custom-app/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/custom-app/client/about/form.html +++ b/content-sets/custom-app/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/content-sets/data-conflict-tools/client/about/form.html b/content-sets/data-conflict-tools/client/about/form.html index 7e1111411e..7109e1d272 100755 --- a/content-sets/data-conflict-tools/client/about/form.html +++ b/content-sets/data-conflict-tools/client/about/form.html @@ -1,40 +1,78 @@ - - - -

About Tangerine

-

- Tangerine is open source software designed for Android mobile devices. Its primary use is to enable - capture of students’ responses in oral reading and mathematics skills assessments as well as interview - responses and field observations. -

-

- Using Tangerine improves data quality and the efficiency of data collection and analysis. The software - simplifies the preparation and implementation of field work, reduces student assessment times, reduces - measurement and data entry errors, and eliminates manual data entry from paper forms. Tangerine is - optimized for offline data collection in low-bandwidth environments and features powerful sync and data - backup options. -

-

- Tangerine was developed by RTI International starting in - 2011 with RTI's own internal research funds. RTI redesigned Tangerine and developed a new codebase using - latest technologies in 2017/2018 with funding support from Google.org. Tangerine is available to the - public through an open-source GNU General Public License. You can host it on your own server and modify - its code as needed. The only requirement is that if you share your modified version publicly, you also - need to share the modified source code with the larger community. -

-

- Since 2011, Tangerine has been used by over 60 organization, in over 70 countries and 100 languages. - While originally developed for education, Tangerine is increasingly used also for interviews and field - observations in the health, governance, and agricultural sectors. -

-

- For more information on Tangerine see http://www.tangerinecentral.org. -

-

- For questions about Tangerine, contact support@tangerinehelp.zendesk.com. -

-
-
-
\ No newline at end of file + + + + + + diff --git a/content-sets/default/client/about/form.html b/content-sets/default/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/default/client/about/form.html +++ b/content-sets/default/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/content-sets/teach/client/about/form.html b/content-sets/teach/client/about/form.html index 4d8fcb24b8..7109e1d272 100755 --- a/content-sets/teach/client/about/form.html +++ b/content-sets/teach/client/about/form.html @@ -1,58 +1,78 @@ - - - - - \ No newline at end of file +" +on-resubmit=" +" +> + + + + + diff --git a/server/src/upgrade/v3.30.2.js b/server/src/upgrade/v3.30.2.js new file mode 100755 index 0000000000..35409c2be5 --- /dev/null +++ b/server/src/upgrade/v3.30.2.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node +const fs = require('fs-extra') + +const groupsList = require('/tangerine/server/src/groups-list.js') +const util = require('util'); +const exec = util.promisify(require('child_process').exec) + +if (process.argv[2] === '--help') { + console.log('Usage:') + console.log('Update about page ') + process.exit() +} + +async function go() { + const groupNames = await groupsList() + for (let groupName of groupNames) { + await exec(`cp -R /tangerine/content-sets/default/client/about /tangerine/groups/${groupName}/client/`); + + console.log(`Upgrading group ${groupName}`) + let forms = await fs.readJson(`/tangerine/client/content/groups/${groupName}/forms.json`) + try { + forms = [ + ...(forms.some(form => form.id === 'about') + ? forms.map(form => + form.id === 'about' + ? { ...form, src: './assets/about/form.html' } + : form + ) + : [ + { + id: 'about', + title: 'About', + listed: false, + archived: true, + src: './assets/about/form.html', + }, + ]), + ] + await fs.writeJson(`/tangerine/client/content/groups/${groupName}/forms.json`, forms) + + } catch (e) { + console.log(`Failed to update forms.json for group ${groupName}`) + console.log(forms) + } + } + + +} +go() \ No newline at end of file From 6b90b9925673d3c0887d9649f5d6e1558766d58f Mon Sep 17 00:00:00 2001 From: Lachezar Hristov Date: Fri, 5 Jan 2024 10:16:01 +0100 Subject: [PATCH 30/43] make script executible --- server/src/upgrade/v3.30.2.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/upgrade/v3.30.2.js b/server/src/upgrade/v3.30.2.js index 35409c2be5..7988e34830 100755 --- a/server/src/upgrade/v3.30.2.js +++ b/server/src/upgrade/v3.30.2.js @@ -1,6 +1,5 @@ #!/usr/bin/env node const fs = require('fs-extra') - const groupsList = require('/tangerine/server/src/groups-list.js') const util = require('util'); const exec = util.promisify(require('child_process').exec) From 805c74dccd082ad38eb8215c1567cd646e0a3a80 Mon Sep 17 00:00:00 2001 From: Lachezar Hristov Date: Fri, 5 Jan 2024 13:16:11 +0100 Subject: [PATCH 31/43] Fix update logic --- server/src/upgrade/v3.30.2.js | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/server/src/upgrade/v3.30.2.js b/server/src/upgrade/v3.30.2.js index 7988e34830..29ff5eea2e 100755 --- a/server/src/upgrade/v3.30.2.js +++ b/server/src/upgrade/v3.30.2.js @@ -19,21 +19,18 @@ async function go() { let forms = await fs.readJson(`/tangerine/client/content/groups/${groupName}/forms.json`) try { forms = [ - ...(forms.some(form => form.id === 'about') - ? forms.map(form => - form.id === 'about' - ? { ...form, src: './assets/about/form.html' } - : form - ) - : [ - { - id: 'about', - title: 'About', - listed: false, - archived: true, - src: './assets/about/form.html', - }, - ]), + ...!forms.find(form => form.id === 'about') + ? [ + { + id: 'about', + title: 'About', + listed: false, + archived: true, + src: './assets/about/form.html', + } + ] + : [], + ...forms ] await fs.writeJson(`/tangerine/client/content/groups/${groupName}/forms.json`, forms) From dfba6fb7ed63449b1936e41f8c3fb48cc1b10f9f Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 17 Jan 2024 12:09:05 -0500 Subject: [PATCH 32/43] Remove undefined and unused variable doLocalWorkaround --- server/src/routes/group-csv.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/src/routes/group-csv.js b/server/src/routes/group-csv.js index ade1c93a5f..a2f963a466 100644 --- a/server/src/routes/group-csv.js +++ b/server/src/routes/group-csv.js @@ -173,14 +173,12 @@ const getDataset = async (datasetId) => { response = await http.get(stateUrl) } catch (error) { if (error.code === 'ECONNREFUSED') { - doLocalWorkaround = true errorMessage = 'Error connecting to server: ' + error.code const url = new URL(stateUrl); url.hostname = 'localhost'; url.protocol = 'http' url.port = 80 stateUrl = url.href - doLocalWorkaround = false errorMessage = '' console.log("Retrying at : " + stateUrl) try { @@ -242,9 +240,6 @@ const getDataset = async (datasetId) => { (!csvDataSet.state.complete && !csvDataSet.state.updatedOn) ) { csvDataSet.status = 'Stopped' - } else if (doLocalWorkaround) { - csvDataSet.status = 'In progress' - csvDataSet.errorMessage = errorMessage } else { csvDataSet.status = 'In progress' } From f5ea04c3e3612671b5b42b05cac2b68eeced3f5d Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 17 Jan 2024 16:29:02 -0500 Subject: [PATCH 33/43] Remove debug log --- server/src/routes/group-csv.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/routes/group-csv.js b/server/src/routes/group-csv.js index a2f963a466..1e090f2a26 100644 --- a/server/src/routes/group-csv.js +++ b/server/src/routes/group-csv.js @@ -169,7 +169,6 @@ const getDataset = async (datasetId) => { let errorMessage = '' // if error connecting. let response try { - console.log("Getting: " + stateUrl) response = await http.get(stateUrl) } catch (error) { if (error.code === 'ECONNREFUSED') { From ec99093d74a012899a7b8325fc35b007ae0a5d4f Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 18 Jan 2024 10:54:33 -0500 Subject: [PATCH 34/43] Remove media-input-editor from form editor UI while in development --- .../ng-tangy-form-editor.component.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html index 8bdb03b514..e32ef5f620 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html @@ -13,12 +13,4 @@ - - - {{'Media Input Editor'|translate}} - - - - - \ No newline at end of file From a805c95e30d6d9af25530117aff6e33a0d1cb904 Mon Sep 17 00:00:00 2001 From: esurface Date: Thu, 18 Jan 2024 10:55:36 -0500 Subject: [PATCH 35/43] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9030243ee5..42e395026f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ __Teach Module Updates__ __Fixes__ - [#3583](https://github.com/Tangerine-Community/Tangerine/issues/3583) +- CSV Generation broken with 'doLocalWorkaround is undefined' error __Server upgrade instructions__ From 7d35363fe05ff3d0428be2546c4349895c618922 Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 30 Jan 2024 13:11:42 -0500 Subject: [PATCH 36/43] Fix CHANGELOG --- CHANGELOG.md | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42e395026f..e1aaa268a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -273,45 +273,6 @@ git checkout -b v3.27.8 v3.27.8 docker rmi tangerine/tangerine:v3.27.7 ``` -## v3.29.0 - -__New Features__ -- Case, Event and Form Archive and Unarchive - -We have released an update to Tangerine which allows for the archiving and un-archiving of both events, and forms within events. This is an extension of the already existing functionality by which an entire case can be archived. The purpose of this is to empower data management teams using Tangerine to "clean up" messy cases where extraneous data has been added to a case in error, or by a conflict situation. The purpose of this document is to summarize both the configuration to enable this, and to demonstrate the use of these functions. This functionality will only apply to the web-based version of Tangerine, and will not be available on tablets. - -__Package Updates__ -- Updated tangy-form to v4.40.0 - -__Server upgrade instructions__ - -Reminder: Consider using the [Tangerine Upgrade Checklist](https://docs.tangerinecentral.org/system-administrator/upgrade-checklist.html) for making sure you test the upgrade safely. - -``` -cd tangerine -# Check the size of the data folder. -du -sh data -# Check disk for free space. -df -h -# If there is not more than 12 GB plus the size of the data folder, create more space before proceeding. -# Good candidates to remove are: data back-up folders and older versions of the Tangerine image -# rm -rf ../data-backup- -# docker rmi tangerine/tangerine: -# Create a backup of the data folder. -cp -r data ../data-backup-$(date "+%F-%T") -# Check logs for the past hour on the server to ensure it's not being actively used. Look for log messages like "Created sync session" for Devices that are syncing and "login success" for users logging in on the server. -docker logs --since=60m tangerine -# Fetch the updates. -git fetch origin -git checkout -b v3.29.0 v3.29.0 -./start.sh v3.29.0 -# Remove Tangerine's previous version Docker Image. -docker rmi tangerine/tangerine: -``` - -## v3.28.X - -- Became v4.0 ## v3.27.7 From ed07dc31747ef3eb85a43f5f3a05ff938e05474b Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 30 Jan 2024 13:34:55 -0500 Subject: [PATCH 37/43] Revert "Remove media-input-editor from form editor UI while in development" This reverts commit ec99093d74a012899a7b8325fc35b007ae0a5d4f. --- .../ng-tangy-form-editor.component.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html index e32ef5f620..8bdb03b514 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html @@ -13,4 +13,12 @@ + + + {{'Media Input Editor'|translate}} + + + + + \ No newline at end of file From f39014011d62f1e9e3004cf77a7b4b9301622680 Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 30 Jan 2024 13:35:01 -0500 Subject: [PATCH 38/43] Revert "Merge branch '3473_media-inputs-updated' into release/v3.30.2" This reverts commit 5320daf74f3bbbf96abc32a040756a9bae3ada48, reversing changes made to 805c74dccd082ad38eb8215c1567cd646e0a3a80. --- README.md | 2 - editor/package.json | 4 +- .../group-media/group-media.component.css | 4 - .../group-media/group-media.component.html | 10 +- .../feedback-editor.component.html | 5 +- .../feedback-editor.component.ts | 2 +- .../feedback-editor/form-metadata.ts | 2 - .../media-input-editor.component.css | 6 - .../media-input-editor.component.html | 73 ---------- .../media-input-editor.component.spec.ts | 23 --- .../media-input-editor.component.ts | 137 ------------------ .../media-input-editor.service.spec.ts | 16 -- .../media-input-editor.service.ts | 40 ----- .../media-input-editor/media-input-item.ts | 10 -- .../media-input-editor/media-list-dialog.html | 13 -- .../ng-tangy-form-editor.module.ts | 7 +- .../ng-tangy-form-editor.component.html | 12 +- editor/src/polyfills.ts | 2 +- .../modules/mysql-js/conf.d/config-file.cnf | 2 +- server/src/routes/group-media-list.js | 12 +- 20 files changed, 12 insertions(+), 370 deletions(-) delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts delete mode 100644 editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html diff --git a/README.md b/README.md index 5cf88b02f8..84afe36dc9 100644 --- a/README.md +++ b/README.md @@ -202,8 +202,6 @@ export NODE_OPTIONS=--openssl-legacy-provider npm start ``` -If you are developing on an M1-based Mac, run `export NODE_OPTIONS="--openssl-legacy-provider"` in your command shell before running `npm start`. - View the app at . If using ngrok.io or tunnelto.dev, use the 'start-using-proxy' instead of 'start' command. This will add some switches that enable the use of some older libraries. diff --git a/editor/package.json b/editor/package.json index 5437bf6419..a1fcd2c355 100644 --- a/editor/package.json +++ b/editor/package.json @@ -33,13 +33,13 @@ "@queso/snake-case": "^0.2.0", "@ts-stack/markdown": "1.4.0", "@types/ua-parser-js": "^0.7.35", - "@vaadin/vaadin-upload": "^4.4.3", + "@vaadin/vaadin-upload": "^4.3.0", "@webcomponents/webcomponentsjs": "^2.4.3", "axios": "^0.21.1", "core-js": "^2.6.11", "couchdb-conflict-manager": "0.0.8", "fast-json-patch": "^3.0.0-1", - "file-list-component": "1.4.0", + "file-list-component": "1.3.2", "json-diff": "^0.5.4", "jwt-decode": "^2.2.0", "moment": "^2.23.0", diff --git a/editor/src/app/groups/group-media/group-media.component.css b/editor/src/app/groups/group-media/group-media.component.css index 32dcb25808..e69de29bb2 100644 --- a/editor/src/app/groups/group-media/group-media.component.css +++ b/editor/src/app/groups/group-media/group-media.component.css @@ -1,4 +0,0 @@ -.file-list { - margin-top: 1em; - margin-left: 1em; -} \ No newline at end of file diff --git a/editor/src/app/groups/group-media/group-media.component.html b/editor/src/app/groups/group-media/group-media.component.html index c358b040f7..cdcf7c9f6d 100644 --- a/editor/src/app/groups/group-media/group-media.component.html +++ b/editor/src/app/groups/group-media/group-media.component.html @@ -1,14 +1,6 @@
- -
-
- - - remove selected files - -
- + diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html index 2ac24bb623..ba4c160eae 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.html @@ -1,5 +1,4 @@ -
-

{{'Feedback Editor'|translate}}

+
@@ -10,7 +9,7 @@

{{'Feedback Editor'|translate}}

- + {{'Feedback Editor'|translate}}
diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts index 9a05d5783f..90930f35c9 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/feedback-editor.component.ts @@ -39,7 +39,7 @@ export class FeedbackEditorComponent implements OnInit { public feedbackService:FeedbackService, private route: ActivatedRoute, public data: FormMetadata, - private http: HttpClient ) {} + private http: HttpClient) {} async ngOnInit() { this.feedback = this.getFeedback() diff --git a/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts b/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts index e1983ba010..269cc79a10 100644 --- a/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts +++ b/editor/src/app/ng-tangy-form-editor/feedback-editor/form-metadata.ts @@ -1,6 +1,5 @@ import {Feedback} from "./feedback"; import { Injectable } from "@angular/core"; -import {MediaInput} from "../media-input-editor/media-input-item"; @Injectable() export class FormMetadata { @@ -8,5 +7,4 @@ export class FormMetadata { title: string; src: string; feedbackItems:Array - mediaInputItems:Array } diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css deleted file mode 100644 index b46b619269..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.css +++ /dev/null @@ -1,6 +0,0 @@ -mat-card-content { - width: 100% -} -#media-inputs-editor { - margin-left: 1em; -} \ No newline at end of file diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html deleted file mode 100644 index 6f5e43fbbc..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.html +++ /dev/null @@ -1,73 +0,0 @@ -
- - - - - - - - - - - - - - - -
-

{{'Media Input Editor'|translate}}

-

{{'If the media elements are not available, add them to the '|translate}}{{'Media Library'|translate}}.

-
{{'Stud.'|translate}}{{'Stud.'|translate}} {{'Attend.'|translate}} {{'Behav.'|translate}} {{'Score.'|translate}}
{{student["student_name"]}} {{student["student_surname"]}} - + + 0) { - scoresMessage = "" + " ; " + _TRANSLATE('score average is: ') + currScores - } } - - // const message = _TRANSLATE('Report for ') + student.name + ': ' + _TRANSLATE('Attendance is ') + student.presentPercentage + '%' + _TRANSLATE(' and behaviour is ') + student.moodPercentage + '%' - const message = _TRANSLATE('Report for ') + student.name + ': ' + attendanceMessage + behaviorMessage + scoresMessage - // sms.send(phone, message, options, success, error); - - let options = { - message: message, // not supported on some apps (Facebook, Instagram) - subject: _TRANSLATE('Student feedback '), // fi. for email - chooserTitle: _TRANSLATE('Pick an app '), // Android only, you can override the default share sheet title - phone: phone, // phone number to share (for WhatsApp only) - // number: phone, // phone number to share (for WhatsApp only) unused. delete. - // appPackageName: 'com.whatsapp' // Android only, you can provide id of the App you want to share with - }; - - const onSuccess = (result) => { - // console.log("Share completed? " + result); // On Android apps mostly return false even while it's true - console.log("Shared to app: " + result); // On Android result.app since plugin version 5.4.0 this is no longer empty. On iOS it's empty when sharing is cancelled (result.completed=false) - }; - - const onError = (msg) => { - console.log("Sharing failed with message: " + msg); - alert( _TRANSLATE('Sharing failed: WhatsApp may not be installed. The following apps are available for sharing: ') + msg); - }; - this.window.plugins.socialsharing.shareWithOptions(options, onSuccess, onError); + } + + const fullMessage = messageList.join("\n") + const onSuccess = (result) => { + console.log("Shared to app: " + result); + }; + const onError = (msg) => { + alert( _TRANSLATE('Sharing failed: WhatsApp may not be installed. The following apps are available for sharing: ') + msg); + }; + + // options are only used in shareViaSMS and shareWithOptions + let options = { + message: fullMessage, + subject: _TRANSLATE('Student feedback'), + phone: phone + }; + + if (type == 'sms') { + // function shareViaSMS (options, phonenumbers, successCallback, errorCallback) + this.window.plugins.socialsharing.shareViaSMS(options, phone, onSuccess, onError) + } else if (type == 'whatsapp') { + // function shareViaSMS(phone, message, fileOrFileArray, url, successCallback, errorCallback) + this.window.plugins.socialsharing.shareViaWhatsAppToPhone(phone, fullMessage, null /* img */, null /* url */, onSuccess, onError) + } else { + this.window.plugins.socialsharing.shareWithOptions(options, onSuccess, onError); } + } else { alert(_TRANSLATE('This feature is only available on a mobile device.')) } diff --git a/translations/translation.en.json b/translations/translation.en.json index 4d1448e6de..475e309e68 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -306,6 +306,7 @@ "There is unsaved data. Are you sure you would like to exit the form?": "There is unsaved data. Are you sure you would like to exit the form?", "This Field is Required": "This Field is Required", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", "Tips": "Tips", "Today": "Today", "Total": "Total", From 7e1bd85baa709d0abfe5a49b7f589e9802ce3442 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 20 Dec 2023 16:43:36 -0500 Subject: [PATCH 25/43] Don't abbreviate curricula labels; Fix attendance messages --- .../attendance-dashboard.component.html | 3 +- .../attendance-dashboard.component.ts | 28 +++++++++---------- .../attendance/attendance.component.html | 6 ++-- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html index 3c7a838c3b..32d86558d8 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html @@ -20,7 +20,7 @@ {{'Behav.'|translate}} {{'Score.'|translate}} {{curriculum.label | slice:0:3}}{{curriculum.label}}
{{'Behav.'|translate}} {{'Score.'|translate}} {{curriculum.label | slice:0:3}}{{curriculum.label}}
{{'Behav.'|translate}} {{'Score.'|translate}} {{curriculum.label | slice:0:3}}{{curriculum.label}}
{{'Behav.'|translate}} {{'Score.'|translate}} {{curriculum.label | slice:0:3}}{{curriculum.label}}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Section Title {{element.title}} Section Name {{element.id}} Media Elements - - -
    -
  • - {{item}} -
  • -
-
-
Controls - - -
- -
- - - - - - diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts deleted file mode 100644 index b0ffe84fb8..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MediaInputEditorComponent } from './media-input-editor.component'; - -describe('MediaInputEditorComponent', () => { - let component: MediaInputEditorComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ MediaInputEditorComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MediaInputEditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts deleted file mode 100644 index 5d0482befd..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.component.ts +++ /dev/null @@ -1,137 +0,0 @@ -import {AfterContentInit, Component, ElementRef, Inject, Input, OnInit, ViewChild} from '@angular/core'; -import {HttpClient} from "@angular/common/http"; -import {FeedbackService} from "../feedback-editor/feedback.service"; -import {FormMetadata} from "../feedback-editor/form-metadata"; -import {Feedback} from "../feedback-editor/feedback"; -import {MediaInput} from "./media-input-item"; -import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog"; -import {MediaInputEditorService} from "./media-input-editor.service"; - -export interface DialogData { - selectedMediaElements: string[] -} - -@Component({ - selector: 'media-input-editor', - templateUrl: './media-input-editor.component.html', - styleUrls: ['./media-input-editor.component.css'] -}) - -export class MediaInputEditorComponent implements OnInit, AfterContentInit { - - @Input() groupId:string - @Input() formId:string - formItems:any - mediaItems:Array = [] - dataSource - showMediaItemsListing:boolean = true - displayedColumns: string[] = ['title','name','mediaElements','controls']; - showMediaInputForm:boolean = false; - // @ViewChild('list', {static: true}) listEl: ElementRef; - showMediaList: boolean = false - selectedMediaElements: string[] = [] - - constructor( - public feedbackService:FeedbackService, - private http: HttpClient, - public dialog: MatDialog, - public mediaInputEditorService: MediaInputEditorService - ) {} - - async ngOnInit(): Promise { - let formHtml = await this.http.get(`/editor/${this.groupId}/content/${this.formId}/form.html`, {responseType: 'text'}).toPromise() - this.formItems = await this.feedbackService.createFormItemsList(formHtml); - await this.getMediaInputsList(null); - } - - ngAfterContentInit() { - // this.listEl.nativeElement.setAttribute('endpoint', './media-list') - } - - private async getMediaInputsList(formMetaData: FormMetadata) { - if (!formMetaData) - formMetaData = await this.feedbackService.getForm(this.groupId, this.formId) - let mediaInputItems = [] - // if (formMetaData.mediaInputItems) { - // let titledMediaItems = formMetaData.mediaInputItems.map(mediaItem => { - // let formItem = this.formItems.find(item => item.id === mediaItem['formItem']) - // // mediaItem.formItemName = formItem.title - // return mediaItem - // }); - // // ORDER_BY formItem, percentile - // mediaInputItems = titledMediaItems - // } - - this.mediaItems = this.formItems.map(fi => { - if (formMetaData.mediaInputItems) { - let mediaItem = formMetaData.mediaInputItems.find(item => item.formItem === fi['id']) - if (mediaItem) { - fi['mediaElements'] = mediaItem - } - } - return fi - }) - // console.log("feedbackItems: " + JSON.stringify(this.feedbackItems)) - this.dataSource = this.mediaItems - if (this.mediaItems.length === 0) { - this.showMediaItemsListing = false - } - } - - editMediaInput(formItemId: any) { - this.showMediaInputForm = true - this.showMediaList = true - this.selectedMediaElements = [] - // this.dialog.open(MediaDialog, { - // data: { - // animal: 'panda', - // }, - // }); - // const dialogRef = this.dialog.open(MediaDialog, { - // data: {selectedMediaElements: this.selectedMediaElements}, - // }); - const dialogRef = this.dialog.open(MediaDialog); - dialogRef.afterClosed().subscribe(result => { - this.selectedMediaElements = result; - console.log("Now need to save this.selectedMediaElements: " + JSON.stringify(this.selectedMediaElements)) - let mediaInput = new MediaInput(formItemId, this.selectedMediaElements) - this.mediaInputEditorService.update(this.groupId, this.formId, mediaInput).then(async (data) => { - await this.getMediaInputsList(data) - // this.showFeedbackForm = false - // this.showFeedbackListing = true - }); - }); - } - - deleteMediaInput(groupName: any, formId: any, formItem: any) { - - } -} - -@Component({ - selector: 'media-list-dialog', - templateUrl: 'media-list-dialog.html', -}) -export class MediaDialog implements AfterContentInit { - // constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {} - @ViewChild('list', {static: true}) listEl: ElementRef; - - constructor(public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: DialogData) {} - - ngAfterContentInit() { - this.listEl.nativeElement.setAttribute('endpoint', './media-list') - } - selectMedia() { - const pathsThatAreSelected = this.listEl.nativeElement.shadowRoot.querySelector('file-list').files.reduce((pathsThatAreSelected, file) => { - return file.selected - ? [...pathsThatAreSelected, file.path] - : pathsThatAreSelected - }, []) - console.log("pathsThatAreSelected: " + JSON.stringify(pathsThatAreSelected)) - this.dialogRef.close(pathsThatAreSelected); - } - onNoClick(): void { - this.dialogRef.close(); - } -} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts deleted file mode 100644 index 5a6f549bea..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { MediaInputEditorService } from './media-input-editor.service'; - -describe('MediaInputEditorService', () => { - let service: MediaInputEditorService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(MediaInputEditorService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts deleted file mode 100644 index a3959d980f..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-editor.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable } from '@angular/core'; -import {Feedback} from "../feedback-editor/feedback"; -import {FormMetadata} from "../feedback-editor/form-metadata"; -import {FeedbackService} from "../feedback-editor/feedback.service"; -import {MediaInput} from "./media-input-item"; -import {HttpClient} from "@angular/common/http"; - -@Injectable({ - providedIn: 'root' -}) -export class MediaInputEditorService { - - constructor(public feedbackService:FeedbackService, - private http: HttpClient) { } - - async update(groupName:string, formId:string, mediaInput: MediaInput) { - const form = await this.feedbackService.getForm(groupName, formId); - if (typeof form.mediaInputItems === 'undefined') { - form.mediaInputItems = [] - } - // delete the previous version - let feedbackItem = form.mediaInputItems.find(item => item.formItem === mediaInput.formItem) - // remove old item - const filteredItems = form.mediaInputItems.filter(item => item !== feedbackItem) - form.mediaInputItems = filteredItems - form.mediaInputItems.push(mediaInput) - let formsJson = await this.http.get>(`/editor/${groupName}/content/forms.json`).toPromise() - const updatedFormsJson = formsJson.map(formInfo => { - if (formInfo.id !== form.id) return Object.assign({}, formInfo) - return Object.assign({}, formInfo, form) - }) - let file = { - groupId: groupName, - filePath:`./forms.json`, - fileContents: JSON.stringify(updatedFormsJson) - } - await this.http.post('/editor/file/save', file).toPromise() - return form - } -} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts deleted file mode 100644 index 55b45fcd3d..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-input-item.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class MediaInput { - formItem:string; - mediaElements:Array - - - constructor(formItem: string, mediaElements: Array) { - this.formItem = formItem; - this.mediaElements = mediaElements; - } -} diff --git a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html b/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html deleted file mode 100644 index 9db2683afb..0000000000 --- a/editor/src/app/ng-tangy-form-editor/media-input-editor/media-list-dialog.html +++ /dev/null @@ -1,13 +0,0 @@ - -

Media Listing

-
- -
-
- - - - - -
- \ No newline at end of file diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts index 0481eb215f..f7a4292af2 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor.module.ts @@ -16,8 +16,6 @@ import {FeedbackService} from "./feedback-editor/feedback.service"; import {MatTableModule} from '@angular/material/table'; import {FormMetadata} from "./feedback-editor/form-metadata"; import {MatCardModule} from '@angular/material/card'; -import {MediaInputEditorComponent, MediaDialog} from './media-input-editor/media-input-editor.component'; -import {MatDialogModule} from "@angular/material/dialog"; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], @@ -33,13 +31,12 @@ import {MatDialogModule} from "@angular/material/dialog"; MatButtonModule, MatTableModule, MatCardModule, - SharedModule, - MatDialogModule + SharedModule ], exports: [ NgTangyFormEditorComponent ], - declarations: [NgTangyFormEditorComponent, FeedbackEditorComponent, MediaInputEditorComponent, MediaDialog], + declarations: [NgTangyFormEditorComponent, FeedbackEditorComponent], providers:[FeedbackService, FormMetadata] }) export class NgTangyFormEditorModule { } diff --git a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html index 8bdb03b514..076afbaeb2 100644 --- a/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html +++ b/editor/src/app/ng-tangy-form-editor/ng-tangy-form-editor/ng-tangy-form-editor.component.html @@ -9,16 +9,6 @@ {{'Feedback Editor'|translate}} - - - - - - - {{'Media Input Editor'|translate}} - - - - + \ No newline at end of file diff --git a/editor/src/polyfills.ts b/editor/src/polyfills.ts index 7fd863e7e8..23ed640be7 100644 --- a/editor/src/polyfills.ts +++ b/editor/src/polyfills.ts @@ -108,7 +108,7 @@ import 'tangy-form-editor/tangy-form-editor.js' import './app/couchdb-conflict-manager/src/couchdb-conflict-manager.js' // @TODO Remove this when this element has been added to tangy-form-editor. // import 'tangy-form/input/tangy-ethio-date.js'; -import '@vaadin/vaadin-upload/vaadin-upload.js' +// import '@vaadin/vaadin-upload/vaadin-upload.js' // import '@polymer/paper-radio-button/paper-radio-button.js'; // import '@polymer/paper-radio-group/paper-radio-group.js'; diff --git a/server/src/modules/mysql-js/conf.d/config-file.cnf b/server/src/modules/mysql-js/conf.d/config-file.cnf index dc397289cf..47d12830b9 100644 --- a/server/src/modules/mysql-js/conf.d/config-file.cnf +++ b/server/src/modules/mysql-js/conf.d/config-file.cnf @@ -1,4 +1,4 @@ [mysqld] innodb-strict-mode=OFF innodb-page-size=64K -innodb-log-buffer-size=128M +innodb-log-buffer-size=128M diff --git a/server/src/routes/group-media-list.js b/server/src/routes/group-media-list.js index 6793389a8f..3ad2d7c9cb 100644 --- a/server/src/routes/group-media-list.js +++ b/server/src/routes/group-media-list.js @@ -3,22 +3,12 @@ const clog = require('tangy-log').clog const log = require('tangy-log').log const util = require('util') const readDir = util.promisify(require('fs').readdir) -const mkdir = util.promisify(require('fs').mkdir) const stat = util.promisify(require('fs').stat) // source: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript function formatBytes(a,b){if(0==a)return"0 Bytes";var c=1024,d=b||2,e=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],f=Math.floor(Math.log(a)/Math.log(c));return parseFloat((a/Math.pow(c,f)).toFixed(d))+" "+e[f]} module.exports = async (req, res) => { - let list - try { - list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) - } catch (e) { - console.error(e) - if (e.code === 'ENOENT') { - mkdir(`/tangerine/client/content/groups/${req.params.group}/media`) - list = [] - } - } + const list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) const files = [] for (let dirent of list) { files.push({ From 8dd3136346f8c215a872dd003c484c054050be7b Mon Sep 17 00:00:00 2001 From: "Chris E. Kelley" Date: Tue, 14 Nov 2023 18:33:49 -0800 Subject: [PATCH 39/43] Got media uploads working again #3583 Updated file-list-component and vaadin-upload libs Create media dir is missing. A little UI work --- editor/package.json | 4 ++-- .../app/groups/group-media/group-media.component.css | 4 ++++ .../groups/group-media/group-media.component.html | 10 +++++++++- editor/src/polyfills.ts | 2 +- server/src/routes/group-media-list.js | 12 +++++++++++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/editor/package.json b/editor/package.json index a1fcd2c355..5437bf6419 100644 --- a/editor/package.json +++ b/editor/package.json @@ -33,13 +33,13 @@ "@queso/snake-case": "^0.2.0", "@ts-stack/markdown": "1.4.0", "@types/ua-parser-js": "^0.7.35", - "@vaadin/vaadin-upload": "^4.3.0", + "@vaadin/vaadin-upload": "^4.4.3", "@webcomponents/webcomponentsjs": "^2.4.3", "axios": "^0.21.1", "core-js": "^2.6.11", "couchdb-conflict-manager": "0.0.8", "fast-json-patch": "^3.0.0-1", - "file-list-component": "1.3.2", + "file-list-component": "1.4.0", "json-diff": "^0.5.4", "jwt-decode": "^2.2.0", "moment": "^2.23.0", diff --git a/editor/src/app/groups/group-media/group-media.component.css b/editor/src/app/groups/group-media/group-media.component.css index e69de29bb2..32dcb25808 100644 --- a/editor/src/app/groups/group-media/group-media.component.css +++ b/editor/src/app/groups/group-media/group-media.component.css @@ -0,0 +1,4 @@ +.file-list { + margin-top: 1em; + margin-left: 1em; +} \ No newline at end of file diff --git a/editor/src/app/groups/group-media/group-media.component.html b/editor/src/app/groups/group-media/group-media.component.html index cdcf7c9f6d..c358b040f7 100644 --- a/editor/src/app/groups/group-media/group-media.component.html +++ b/editor/src/app/groups/group-media/group-media.component.html @@ -1,6 +1,14 @@
+ +
+
+ + + remove selected files + +
- + diff --git a/editor/src/polyfills.ts b/editor/src/polyfills.ts index 23ed640be7..7fd863e7e8 100644 --- a/editor/src/polyfills.ts +++ b/editor/src/polyfills.ts @@ -108,7 +108,7 @@ import 'tangy-form-editor/tangy-form-editor.js' import './app/couchdb-conflict-manager/src/couchdb-conflict-manager.js' // @TODO Remove this when this element has been added to tangy-form-editor. // import 'tangy-form/input/tangy-ethio-date.js'; -// import '@vaadin/vaadin-upload/vaadin-upload.js' +import '@vaadin/vaadin-upload/vaadin-upload.js' // import '@polymer/paper-radio-button/paper-radio-button.js'; // import '@polymer/paper-radio-group/paper-radio-group.js'; diff --git a/server/src/routes/group-media-list.js b/server/src/routes/group-media-list.js index 3ad2d7c9cb..6793389a8f 100644 --- a/server/src/routes/group-media-list.js +++ b/server/src/routes/group-media-list.js @@ -3,12 +3,22 @@ const clog = require('tangy-log').clog const log = require('tangy-log').log const util = require('util') const readDir = util.promisify(require('fs').readdir) +const mkdir = util.promisify(require('fs').mkdir) const stat = util.promisify(require('fs').stat) // source: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript function formatBytes(a,b){if(0==a)return"0 Bytes";var c=1024,d=b||2,e=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],f=Math.floor(Math.log(a)/Math.log(c));return parseFloat((a/Math.pow(c,f)).toFixed(d))+" "+e[f]} module.exports = async (req, res) => { - const list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) + let list + try { + list = await readDir(`/tangerine/client/content/groups/${req.params.group}/media`, {withFileTypes: true}) + } catch (e) { + console.error(e) + if (e.code === 'ENOENT') { + mkdir(`/tangerine/client/content/groups/${req.params.group}/media`) + list = [] + } + } const files = [] for (let dirent of list) { files.push({ From 19a592752b2b45d2e40304b12f3217bd0dc9f8b1 Mon Sep 17 00:00:00 2001 From: esurface Date: Tue, 30 Jan 2024 14:02:09 -0500 Subject: [PATCH 40/43] Update CHANGELOG and remove logs --- CHANGELOG.md | 2 +- server/src/routes/group-media-upload.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1aaa268a2..2b22cdaeee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ __Teach Module Updates__ - Fix the names not displaying in the tables __Fixes__ -- [#3583](https://github.com/Tangerine-Community/Tangerine/issues/3583) +- Get Media Uploads working in Editor [#3583](https://github.com/Tangerine-Community/Tangerine/issues/3583) - CSV Generation broken with 'doLocalWorkaround is undefined' error diff --git a/server/src/routes/group-media-upload.js b/server/src/routes/group-media-upload.js index 5e8b0b547f..281404b226 100644 --- a/server/src/routes/group-media-upload.js +++ b/server/src/routes/group-media-upload.js @@ -13,9 +13,7 @@ module.exports = async (req, res) => { } catch (e) { await exec(`mkdir /tangerine/client/content/groups/${req.params.group}/media`) } - console.log("Uploads? Anybody???", req.files) for (let file of req.files) { - console.log("File: ", file) await exec(`mv ${file.path} /tangerine/client/content/groups/${req.params.group}/media/${file.originalname.replace(/(\s+)/g, '\\$1')}`) } res.send() From a9c90ffb789fcff01d3a683bbf95520ecb9eee91 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 31 Jan 2024 11:43:57 -0500 Subject: [PATCH 41/43] Prepare new translations --- .../attendance-check.component.ts | 3 +- .../attendance-dashboard.component.html | 2 +- .../attendance-dashboard.component.ts | 2 +- .../attendance-scores.component.ts | 2 +- .../behavior-check.component.ts | 1 - .../student-details.component.html | 6 +- translations/translation.JO_ar.json | 822 ++++++++++-------- translations/translation.KH_km.json | 55 ++ translations/translation.amh.json | 55 ++ translations/translation.bn.json | 668 +++++++++----- translations/translation.en.json | 54 +- translations/translation.es_gt.json | 728 ++++++++++------ translations/translation.faprs.json | 602 +++++++++---- translations/translation.fr.json | 55 ++ translations/translation.hi.json | 635 +++++++++----- translations/translation.ps.json | 604 +++++++++---- translations/translation.pt.json | 668 +++++++++----- translations/translation.ru.json | 55 ++ translations/translation.sw.json | 630 ++++++++++---- translations/translation.tg.json | 55 ++ translations/translation.ur.json | 570 +++++++++--- translations/translation.vn.json | 666 +++++++++----- 22 files changed, 4720 insertions(+), 2218 deletions(-) diff --git a/client/src/app/class/attendance/attendance-check/attendance-check.component.ts b/client/src/app/class/attendance/attendance-check/attendance-check.component.ts index 1f2a1f34ea..90c82f7395 100644 --- a/client/src/app/class/attendance/attendance-check/attendance-check.component.ts +++ b/client/src/app/class/attendance/attendance-check/attendance-check.component.ts @@ -84,7 +84,6 @@ export class AttendanceCheckComponent implements OnInit { */ async showAttendanceListing(currentClassId, curriculum, currentClass) { const type = "attendance" - const registerNameForDialog = 'Attendance'; this.behaviorForms = this.dashboardService.getBehaviorForms() const students = await this.dashboardService.getMyStudents(currentClassId); const schoolName = this.getValue('school_name', currentClass) @@ -117,7 +116,7 @@ export class AttendanceCheckComponent implements OnInit { this.attendanceList = await this.dashboardService.getAttendanceList(students, savedAttendanceList, curriculum) if (!currentAttendanceReport) { // TODO check if the currentAttendanceReport.timestamp or currentAttendanceReport.reportDate is today. - const startRegister = confirm(_TRANSLATE('Begin ' + registerNameForDialog + ' record for today?')) + const startRegister = confirm(_TRANSLATE('Begin Attendance record for today?')) if (startRegister) { } else { this.router.navigate(['/attendance-dashboard/']); diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html index 32d86558d8..eaaf240cca 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.html @@ -90,6 +90,6 @@

{{'No Students currently registered.'|translate}}

+ *ngIf="!attendanceReport || attendanceReport?.attendanceList.length === 0">{{'You must register students before you can view the attendance dashboard.'|translate}}

\ No newline at end of file diff --git a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts index 02b198710c..385d3a2c68 100644 --- a/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts +++ b/client/src/app/class/attendance/attendance-dashboard/attendance-dashboard.component.ts @@ -171,7 +171,7 @@ export class AttendanceDashboardComponent implements OnInit { } let messageList = []; - const message = _TRANSLATE('Report for ') + student.student_name + ': ' + const message = _TRANSLATE('Report for') + ' ' + student.student_name + ': ' messageList.push(message) if (student.presentPercentage) { diff --git a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts index b2270fa85c..164fefe037 100644 --- a/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts +++ b/client/src/app/class/attendance/attendance-scores/attendance-scores.component.ts @@ -163,7 +163,7 @@ export class AttendanceScoresComponent implements OnInit { const result = await this.dashboardService.saveDoc(this.scoreRegister) if (result.ok) { this.saveSuccess = true - this.tangySnackbarService.showText(_TRANSLATE('Score saved')) + this.tangySnackbarService.showText(_TRANSLATE('Saved')) setTimeout(() => { this.saveSuccess = false }, 2000); diff --git a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts index d0f928125d..f3d539ecf0 100644 --- a/client/src/app/class/attendance/behavior-check/behavior-check.component.ts +++ b/client/src/app/class/attendance/behavior-check/behavior-check.component.ts @@ -88,7 +88,6 @@ export class BehaviorCheckComponent implements OnInit { */ async showBehaviorListing(currentClassId, curriculum, currentClass) { const type = "behavior" - const registerNameForDialog = 'Behavior'; this.behaviorForms = this.dashboardService.getBehaviorForms() const students = await this.dashboardService.getMyStudents(currentClassId); const schoolName = this.getValue('school_name', currentClass) diff --git a/client/src/app/class/attendance/student-details/student-details.component.html b/client/src/app/class/attendance/student-details/student-details.component.html index 00611d957b..065d85968c 100644 --- a/client/src/app/class/attendance/student-details/student-details.component.html +++ b/client/src/app/class/attendance/student-details/student-details.component.html @@ -1,6 +1,6 @@
-

{{data.student.name}} {{data.student.surname}}

+

{{data.student.student_name}} {{data.student.student_surname}}

{{curriculumLabel}}

{{'Attendance'|translate}}

@@ -18,7 +18,7 @@

{{curriculumLabel}}

{{item.key}}: {{item.value}} -

{{'score average is'|translate}}

+

{{'Score average'|translate}}

  • {{item.key}}: {{item.value}}% @@ -35,7 +35,7 @@

    {{curriculumLabel}}

-

{{'score average is'|translate}}: {{data.student['score']}}%

+

{{'Score average'|translate}}: {{data.student['score']}}%

diff --git a/translations/translation.JO_ar.json b/translations/translation.JO_ar.json index 8e0c424e7b..1c3cfe501e 100644 --- a/translations/translation.JO_ar.json +++ b/translations/translation.JO_ar.json @@ -1,385 +1,441 @@ { - "% Correct":"٪ ﺺﻴﺣ:", -"=+ Add User to Group":"=+ إضافة مستخدم إلى المجموعة", -"=+ Create a New Form":"=+ إنشاء نموذج جديد", -"=+ Create a New Group":"=+ إنشاء مجموعة جديدة", -"=+ Create a New User":"=+ إنشاء مستخدم جديد", -"About":"حول", -"Accuracy":"ﺎﻟﺪﻗﺓ:", - "Accuracy Level:": "مستوى ﺎﻟﺪﻗﺓ:", -"Activity":"النشاط", -"Add Class":"ﺈﺿﺎﻓﺓ ﺺﻓ", -"Add New User":"إضافة مستخدم جديد", -"Add Student":"ﺈﺿﺎﻓﺓ ﻁﺎﻠﺑ", -"Add User to Group":"إضافة مستخدم إلى المجموعة", -"An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"ﺎﻠﺘﺣﺪﻴﺛ ﺄﺼﺒﺣ ﺝﺎﻫﺯًﺍ. ﺕﺄﻛﺩ ﺃﻭﻻ ﻢﻧ ﺖﺤﻤﻴﻟ ﺞﻤﻴﻋ ﺐﻳﺎﻨﺘﻛ ﻖﺒﻟ ﻊﻤﻠﻳﺓ ﺎﻠﺘﺣﺪﻴﺛ.. ﺇﺫﺍ ﻞﻣ ﺖﻘﻣ ﺐﺘﺤﻤﻴﻟ ﺎﻠﺒﻳﺎﻧﺎﺗ ﺎﻀﻐﻃ ﻊﻟﻯ ﺯﺭ`ﺈﻠﻏﺍﺀ`. ﺇﺫﺍ ﻖﻤﺗ ﺐﺘﺤﻤﻴﻟ ﺐﻳﺎﻨﺘﻛ ﻮﺟﺎﻫﺯ ﻞﻠﺘﺣﺪﻴﺛ ﺎﻀﻐﻃ ﺯﺭ `ﻡﻭﺎﻔﻗ ﺃﻭ ﻦﻌﻣ`", -"Applying Updates...":"ﺝﺍﺮﻳ ﺎﻠﺘﺣﺪﻴﺛ...", -"April":"إبريل", -"Are you sure you want to restore this backup? It will wipe any data already in Tangerine.":"هل تريد بالتأكيد استعادة هذه النسخة الاحتياطية؟ سيؤدي ذلك إلى مسح أي بيانات موجودة بالفعل في Tangerine.", -"Are you sure you want to start a form response?":"ﻪﻟ ﺄﻨﺗ ﻢﺗﺄﻛﺩ ﻢﻧ ﺎﻠﺑﺩﺀ ﺐﺘﻌﺒﺋﺓ ﺲﺠﻟ ﺖﻘﻴﻴﻣ ﺝﺪﻳﺩ؟", -"Are you sure you would like to exit the form?":"ﻪﻟ ﺄﻨﺗ ﻢﺗﺄﻛﺩ ﻢﻧ ﺮﻐﺒﺘﻛ ﻒﻳ ﺎﻠﺧﺭﻮﺟ ﻢﻧ ﺲﺠﻟ ﺎﻠﺘﻘﻴﻴﻣ؟", -"August":"أغسطس", -"Average":"المتوسط", -"Average Correct":" ﻢﺗﻮﺴﻃ ﺍﻺﺟﺎﺑﺎﺗ ﺎﻠﺼﺤﻴﺣﺓ ", -"Average Correct (%)":"ﻢﺗﻮﺴﻃ ﺍﻺﺟﺎﺑﺎﺗ ﺎﻠﺼﺤﻴﺣﺓ (٪)", -"Backup directory":"دليل النسخ الاحتياطي", -"Before continuing, let's review this info to make sure you registered with the right device info.":"قبل المتابعة، لنراجع هذه المعلومات للتأكد من أنك سجلت باستخدام معلومات الجهاز الصحيحة.", -"Camera authorized.":"تم منح الإذن باستخدام الكاميرا.", -"Case":"الحالة", -"Cases":"الحالات", -"Check for Update":"ﺖﺤﻘﻗ ﻢﻧ ﺎﻠﺘﺣﺪﻴﺛ", -"Checking":"ﺎﻠﺘﺤﻘﻗ ﻢﻧ ﻮﺟﻭﺩ ﺎﻠﺘﺣﺪﻴﺛ", -"Checking For Updates...":"ﺝﺍﺮﻳ ﺎﻠﺒﺤﺛ ﻊﻧ ﺖﺣﺪﻴﺛﺎﺗ...", -"Choose a task report from one of the following selections:":"اختر تقرير مهمة من أحد الاختيارات الآتية:", -"Choose type...":"اختيار النوع...", -"Choose which case type":"اختر نوع الحالة", -"Class Grouping":"مجموعات الصف", -"Class Size":"ﻉﺩﺩ ﺎﻠﻄﻠﺑﺓ ﻒﻳ ﺎﻠﺼﻓ...", -"Class grouping":"ﺖﺼﻨﻴﻓ ﺎﻠﺼﻓ", -"Click a Picture":"ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﺻﻭﺭﺓ", -"Click on a percentile to view related feedback.":"انقر فوق نسبة مئوية لعرض التعليقات ذات الصلة.", -"Click the play button to get started.":"ﺎﻀﻐﻃ ﻊﻟﻯ ﺯﺭ ﺎﺑﺩﺃ .", -"Click to Download":"انقر للتنزيل", -"Close":"إغلاق", -"Close the application completely and re-open.":"أغلق التطبيق بالكامل وأعد فتحه.", -"Complete":"مكتمل", -"Completed?":"هل اكتملت العملية؟", -"Concerning":"بخصوص", -"Confirm New Password":"ﺕﺄﻛﺩ ﻢﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﺎﻠﺟﺪﻳﺩﺓ", -"Confirm Password":"ﺕﺄﻛﺩ ﻢﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ", -"Confirm Password is required":"يلزم تأكيد كلمة المرور", -"Continue":"متابعة", -"Correct":"ﺺﺤﻴﺣ", -"Could Not Contact Server.":"تعذر الاتصال بالخادم.", -"Could Not Create User":"ﻞﻣ ﻲﺘﻤﻜﻧ ﻢﻧ ﺈﻨﺷﺍﺀ ﻢﺴﺘﺧﺪﻣ ﺝﺪﻳﺩ", -"Could Not Generate APK":"تعذر إنشاء ملف APK", -"Could Not Generate PWA":"تعذر إنشاء ملف PWA", -"Could Not Load List Of Forms":"ﻞﻣ ﻲﺘﻤﻜﻧ ﻢﻧ ﺖﻧﺰﻴﻟ ﻕﺎﺌﻣﺓ ﺎﻠﺴﺟﻼﺗ", -"Create":"إنشاء", -"Create Form":"ﺈﻨﺷﺍﺀ ﺲﺠﻟ", -"Create New Case":"إنشاء حالة جديدة", -"Creating new case...":"جارٍ إنشاء حالة جديدة...", -"Current":"الحالي", -"Curriculum":"ﻢﻨﻫﺎﺟ ﺩﺭﺎﺴﻳ", -"DATA QUERIES":"استعلامات البيانات", -"Date and Time":"ﺎﻠﺗﺍﺮﻴﺧ ﻭﺎﻟﻮﻘﺗ", -"Day":"اليوم", -"Day View":"عرض اليوم", -"December":"ديسمبر", -"Device ID":"معرِّف الجهاز", -"Differences":"الاختلافات", -"Distance from reference":"المسافة من النقطة المرجعية", -"Do you have a Device QR code to scan?":"هل يوجد رمز استجابة سريعة للجهاز لمسحه ضوئيًا؟", -"Docs Not Uploaded":"ﻞﻣ ﻲﺘﻣ ﺖﺤﻤﻴﻟ ﺎﻠﻤﻠﻓﺎﺗ", -"Docs Uploaded":"ﺖﺤﻤﻴﻟ ﺎﻠﻤﻠﻓﺎﺗ", -"Does the above info look like the right device info?":"هل المعلومات أعلاه تبدو معلومات الجهاز الصحيحة؟", -"Done! Please exit the app and restart.":"تم! يُرجى الخروج من التطبيق وإعادة التشغيل.", -"Download CSV":"ﺖﻧﺰﻴﻟ ﻢﻠﻓ CSV", -"Download your APK":"تنزيل ملف APK", -"EXPORT DATA FOR ALL USERS":"ﺈﺻﺩﺍﺭ ﺎﻠﺒﻳﺎﻧﺎﺗ ﻞﺠﻤﻴﻋ ﺎﻠﻤﺴﺘﺧﺪﻤﻴﻧ", -"Edit Item":"ﺖﻋﺪﻴﻟ ﺎﻠﻔﻗﺭﺓ", -"Email":"البريد الإلكتروني", -"Enter your response to above question here":"ﺄﺠﺑ ﻊﻧ ﺎﻠﺳﺅﺎﻟ ﺄﻋﻼﻫ ﻪﻧﺍ", -"Error Downloading File":"خطأ في تنزيل الملف", -"Error restoring db ":"خطأ في استعادة قاعدة البيانات ", -"Event":"الفعالية", -"Export Backup":"تصدير النسخة الاحتياطية", -"Export Data":"ﺈﺻﺩﺍﺭ ﺎﻠﺒﻳﺎﻧﺎﺗ", -"Export Data creates a backup of all of your records and saves it to your device.":"يقوم تصدير البيانات بإنشاء نسخة احتياطية من كل تسجيلاتك ويحفظها إلى جهازك.", -"Failed to download application configuration file":"فشل تنزيل ملف تكوين التطبيق.", -"February":"فبراير", -"Feedback":"التعليقات", -"File Stored At":"ﺖﻣ ﺢﻔﻇ ﺎﻠﻤﻠﻓ ﻒﻳ", -"File restored from ":"تمت استعادة الملف من ", -"Filter":"ﺖﺼﻔﻳﺓ", -"Find Case":"البحث عن حالة", -"Finished restoring backups. Please wait for indexing to complete.":"اكتملت استعادة النُّسخ الاحتياطية. يُرجى الانتظار حتى تكتمل الفهرسة.", -"First Name":"الاسم الأول", -"Form":"النموذج", -"Form Id":"معرِّف النموذج", -"Form Name":"ﺄﻨﺸﺋ ﺎﺴﻣ", -"Form Title":"ﺄﻨﺸﺋ ﻊﻧﻭﺎﻧ", -"Forms":"النماذج", -"Generate APK/PWA":"إنشاء ملف APK/PWA", -"Generating CSV":"جارٍ إنشاء ملف CSV", -"Geolocation authorized.":"تم منح الإذن بتحديد الموقع الجغرافي.", -"Good":"جيد", -"Great":"رائع", -"Great! Use this QR scanner below to scan the code in.":"رائع! استخدِم ماسح رمز الاستجابة السريعة أدناه لمسح الرمز ضوئيًا.", -"Group":"المجموعة", -"Group Created Succesfully":"تم إنشاء المجموعة بنجاح", -"Group Details":"تفاصيل المجموعة", -"Group Name":"اسم المجموعة", -"Grouping Report":"تقرير المجموعات", -"Help":"المساعدة", -"Home":"الصفحة الرئيسية", -"ISSUES":"المشكلات", -"If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.":"بالنسبة إلى ملف APK (الذي يعمل على كمبيوتر لوحي): ضع الملفات (نسخة احتياطية مشفرة من قاعدة البيانات) أو الدلائل (نسخ احتياطية غير مشفرة من قاعدة البيانات) في Documents/Tangerine/restore directory. اضغط على الزر أدناه لبدء عملية الاستعادة.", -"If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.":"بالنسبة إلى ملف PWA (الذي يعمل على جهاز كمبيوتر و/أو متصفح ويب): اضغط على الزر أدناه واختر الدليل المخزنة فيه ملفات النسخ الاحتياطي. وسيؤدي ذلك إلى بدء عملية الاستعادة.", -"Incomplete":"غير مكتمل", -"Instructions:":"تعليمات:", -"Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.":"إذا ظهر الخطأ 'Is Backup a File?: false'، فهذا يعني أنه ربما تكون لديك نسخة احتياطية من قاعدة بيانات غير مشفرة تقوم بالنسخ الاحتياطي إلى دليل بدلاً من ملف.", -"Item Listing":"ﻕﺎﺌﻣﺓ ﺎﻠﻔﻗﺭﺎﺗ", -"Item Not Found":"ﺎﻠﻔﻗﺭﺓ ﻎﻳﺭ ﻡﻮﺟﻭﺩﺓ", -"Item Title":"ﻊﻧﻭﺎﻧ ﺎﻠﻔﻗﺭﺓ ﺃﻭ ﺎﻠﺒﻧﺩ", -"January":"يناير", -"July":"يوليو", -"June":"يونيو", -"LAST ATTEMPTED":"ﺂﺧﺭ ﻢﺣﺍﻮﻟﺓ", -"LOGIN":"ﺖﺴﺠﻴﻟ ﺎﻟﺪﺧﻮﻟ", -"Last Name":"الاسم الأخير", -"Last Successful Sync Timestamp":"ﺂﺧﺭ ﻢﺣﺍﻮﻟﺓ ﻥﺎﺠﺣﺓ ﻞﺘﻧﺰﻴﻟ ﻮﺗﺯﺎﻤﻧ ﺎﻠﺒﻳﺎﻧﺎﺗ", -"Last attempted cannot be before an item marked.":"لا يمكن إجراء آخر محاولة قبل تحديد أحد العناصر.", -"Latitude":"ﺦﻃ ﺎﻠﻋﺮﺿ:", -"Let's get your device set up.":"لنقم بإعداد جهازك.", -"Let's try again.":"لنحاول مرة أخرى.", -"Loading":"ﺝﺍﺭٍ ﺎﻠﺘﺤﻤﻴﻟ...", -"Location":"الموقع", -"Login":"تسجيل الدخول", -"Login Unsuccesful":"ﺖﺴﺠﻴﻟ ﺎﻟﺪﺧﻮﻟ ﻎﻳﺭ ﻥﺎﺠﺣ", -"Logout":"ﺎﻠﺧﺭﻮﺟ", -"Longitude":"ﺦﻃ ﺎﻠﻃﻮﻟ", -"MARK":"تحديد", -"Manage Groups":"إدارة المجموعات", -"Manage Profile":"ﺇﺩﺍﺭﺓ ﺎﻠﻤﻠﻓ ﺎﻠﺸﺨﺼﻳ", -"Manage Users":"إدارة المستخدمين", -"March":"مارس", -"May":"مايو", -"Mediocre":"متوسط", -"Meters":"ﻢﺗﺭ", -"Month":"الشهر", -"My Forms":"ﺲﺟﻼﺘﻳ", -"Name":"الاسم", -"New Case":"حالة جديدة", -"New Event":"فعالية جديدة", -"New Form":"ﺲﺠﻟ ﺝﺪﻳﺩ", -"New Group":"مجموعة جديدة", -"New Item":"ﻒﻗﺭﺓ ﺝﺪﻳﺩﺓ", -"New Password":"ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﺎﻠﺟﺪﻳﺩﺓ", -"New comment by you":"تعليق جديد منك", + "% Correct": "٪ ﺺﻴﺣ:", + "+ Add User to Group": "=+ إضافة مستخدم إلى المجموعة", + "+ Create a New Form": "=+ إنشاء نموذج جديد", + "+ Create a New Group": "=+ إنشاء مجموعة جديدة", + "+ Create a New User": "=+ إنشاء مستخدم جديد", + "About": "حول", + "Accuracy": "ﺎﻟﺪﻗﺓ:", + "Accuracy Level": "Accuracy Level", + "Accuracy Level:": "مستوى ﺎﻟﺪﻗﺓ:", + "Activity": "النشاط", + "Add Class": "ﺈﺿﺎﻓﺓ ﺺﻓ", + "Add New User": "إضافة مستخدم جديد", + "Add Student": "ﺈﺿﺎﻓﺓ ﻁﺎﻠﺑ", + "Add User to Group": "إضافة مستخدم إلى المجموعة", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "ﺎﻠﺘﺣﺪﻴﺛ ﺄﺼﺒﺣ ﺝﺎﻫﺯًﺍ. ﺕﺄﻛﺩ ﺃﻭﻻ ﻢﻧ ﺖﺤﻤﻴﻟ ﺞﻤﻴﻋ ﺐﻳﺎﻨﺘﻛ ﻖﺒﻟ ﻊﻤﻠﻳﺓ ﺎﻠﺘﺣﺪﻴﺛ.. ﺇﺫﺍ ﻞﻣ ﺖﻘﻣ ﺐﺘﺤﻤﻴﻟ ﺎﻠﺒﻳﺎﻧﺎﺗ ﺎﻀﻐﻃ ﻊﻟﻯ ﺯﺭ`ﺈﻠﻏﺍﺀ`. ﺇﺫﺍ ﻖﻤﺗ ﺐﺘﺤﻤﻴﻟ ﺐﻳﺎﻨﺘﻛ ﻮﺟﺎﻫﺯ ﻞﻠﺘﺣﺪﻴﺛ ﺎﻀﻐﻃ ﺯﺭ `ﻡﻭﺎﻔﻗ ﺃﻭ ﻦﻌﻣ`", + "Applying Updates...": "ﺝﺍﺮﻳ ﺎﻠﺘﺣﺪﻴﺛ...", + "April": "إبريل", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "هل تريد بالتأكيد استعادة هذه النسخة الاحتياطية؟ سيؤدي ذلك إلى مسح أي بيانات موجودة بالفعل في Tangerine.", + "Are you sure you want to start a form response?": "ﻪﻟ ﺄﻨﺗ ﻢﺗﺄﻛﺩ ﻢﻧ ﺎﻠﺑﺩﺀ ﺐﺘﻌﺒﺋﺓ ﺲﺠﻟ ﺖﻘﻴﻴﻣ ﺝﺪﻳﺩ؟", + "Are you sure you would like to exit the form?": "ﻪﻟ ﺄﻨﺗ ﻢﺗﺄﻛﺩ ﻢﻧ ﺮﻐﺒﺘﻛ ﻒﻳ ﺎﻠﺧﺭﻮﺟ ﻢﻧ ﺲﺠﻟ ﺎﻠﺘﻘﻴﻴﻣ؟", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "أغسطس", + "Average": "المتوسط", + "Average Correct": " ﻢﺗﻮﺴﻃ ﺍﻺﺟﺎﺑﺎﺗ ﺎﻠﺼﺤﻴﺣﺓ ", + "Average Correct (%)": "ﻢﺗﻮﺴﻃ ﺍﻺﺟﺎﺑﺎﺗ ﺎﻠﺼﺤﻴﺣﺓ (٪)", + "Back": "رجوع", + "Backup directory": "دليل النسخ الاحتياطي", + "Before continuing, let's review this info to make sure you registered with the right device info.": "قبل المتابعة، لنراجع هذه المعلومات للتأكد من أنك سجلت باستخدام معلومات الجهاز الصحيحة.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "تم منح الإذن باستخدام الكاميرا.", + "Case": "الحالة", + "Cases": "الحالات", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "ﺖﺤﻘﻗ ﻢﻧ ﺎﻠﺘﺣﺪﻴﺛ", + "Checking": "ﺎﻠﺘﺤﻘﻗ ﻢﻧ ﻮﺟﻭﺩ ﺎﻠﺘﺣﺪﻴﺛ", + "Checking For Updates...": "ﺝﺍﺮﻳ ﺎﻠﺒﺤﺛ ﻊﻧ ﺖﺣﺪﻴﺛﺎﺗ...", + "Choose a task report from one of the following selections:": "اختر تقرير مهمة من أحد الاختيارات الآتية:", + "Choose type...": "اختيار النوع...", + "Choose which case type": "اختر نوع الحالة", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "مجموعات الصف", + "Class Size": "ﻉﺩﺩ ﺎﻠﻄﻠﺑﺓ ﻒﻳ ﺎﻠﺼﻓ...", + "Class grouping": "ﺖﺼﻨﻴﻓ ﺎﻠﺼﻓ", + "Classes": "Classes", + "Click a Picture": "ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﺻﻭﺭﺓ", + "Click on a percentile to view related feedback.": "انقر فوق نسبة مئوية لعرض التعليقات ذات الصلة.", + "Click the play button to get started.": "ﺎﻀﻐﻃ ﻊﻟﻯ ﺯﺭ ﺎﺑﺩﺃ .", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "انقر للتنزيل", + "Close": "إغلاق", + "Close the application completely and re-open.": "أغلق التطبيق بالكامل وأعد فتحه.", + "Complete": "مكتمل", + "Completed?": "هل اكتملت العملية؟", + "Concerning": "بخصوص", + "Confirm New Password": "ﺕﺄﻛﺩ ﻢﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﺎﻠﺟﺪﻳﺩﺓ", + "Confirm Password": "ﺕﺄﻛﺩ ﻢﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ", + "Confirm Password is required": "يلزم تأكيد كلمة المرور", + "Continue": "متابعة", + "Correct": "ﺺﺤﻴﺣ", + "Could Not Contact Server.": "تعذر الاتصال بالخادم.", + "Could Not Create User": "ﻞﻣ ﻲﺘﻤﻜﻧ ﻢﻧ ﺈﻨﺷﺍﺀ ﻢﺴﺘﺧﺪﻣ ﺝﺪﻳﺩ", + "Could Not Generate APK": "تعذر إنشاء ملف APK", + "Could Not Generate PWA": "تعذر إنشاء ملف PWA", + "Could Not Load List Of Forms": "ﻞﻣ ﻲﺘﻤﻜﻧ ﻢﻧ ﺖﻧﺰﻴﻟ ﻕﺎﺌﻣﺓ ﺎﻠﺴﺟﻼﺗ", + "Create": "إنشاء", + "Create Form": "ﺈﻨﺷﺍﺀ ﺲﺠﻟ", + "Create New Case": "إنشاء حالة جديدة", + "Creating new case...": "جارٍ إنشاء حالة جديدة...", + "Current": "الحالي", + "Curriculum": "ﻢﻨﻫﺎﺟ ﺩﺭﺎﺴﻳ", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "استعلامات البيانات", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "ﺎﻠﺗﺍﺮﻴﺧ ﻭﺎﻟﻮﻘﺗ", + "Day": "اليوم", + "Day View": "عرض اليوم", + "December": "ديسمبر", + "Device ID": "معرِّف الجهاز", + "Differences": "الاختلافات", + "Distance from reference": "المسافة من النقطة المرجعية", + "Do you have a Device QR code to scan?": "هل يوجد رمز استجابة سريعة للجهاز لمسحه ضوئيًا؟", + "Docs Not Uploaded": "ﻞﻣ ﻲﺘﻣ ﺖﺤﻤﻴﻟ ﺎﻠﻤﻠﻓﺎﺗ", + "Docs Uploaded": "ﺖﺤﻤﻴﻟ ﺎﻠﻤﻠﻓﺎﺗ", + "Does the above info look like the right device info?": "هل المعلومات أعلاه تبدو معلومات الجهاز الصحيحة؟", + "Done! Please exit the app and restart.": "تم! يُرجى الخروج من التطبيق وإعادة التشغيل.", + "Download CSV": "ﺖﻧﺰﻴﻟ ﻢﻠﻓ CSV", + "Download your APK": "تنزيل ملف APK", + "EXPORT DATA FOR ALL USERS": "ﺈﺻﺩﺍﺭ ﺎﻠﺒﻳﺎﻧﺎﺗ ﻞﺠﻤﻴﻋ ﺎﻠﻤﺴﺘﺧﺪﻤﻴﻧ", + "Edit Item": "ﺖﻋﺪﻴﻟ ﺎﻠﻔﻗﺭﺓ", + "Email": "البريد الإلكتروني", + "End Date": "End Date", + "Enter your response to above question here": "ﺄﺠﺑ ﻊﻧ ﺎﻠﺳﺅﺎﻟ ﺄﻋﻼﻫ ﻪﻧﺍ", + "Error Downloading File": "خطأ في تنزيل الملف", + "Error restoring db ": "خطأ في استعادة قاعدة البيانات ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "الفعالية", + "Export Backup": "تصدير النسخة الاحتياطية", + "Export Data": "ﺈﺻﺩﺍﺭ ﺎﻠﺒﻳﺎﻧﺎﺗ", + "Export Data creates a backup of all of your records and saves it to your device.": "يقوم تصدير البيانات بإنشاء نسخة احتياطية من كل تسجيلاتك ويحفظها إلى جهازك.", + "Failed to download application configuration file": "فشل تنزيل ملف تكوين التطبيق.", + "February": "فبراير", + "Feedback": "التعليقات", + "File Stored At": "ﺖﻣ ﺢﻔﻇ ﺎﻠﻤﻠﻓ ﻒﻳ", + "File restored from ": "تمت استعادة الملف من ", + "Filter": "ﺖﺼﻔﻳﺓ", + "Find Case": "البحث عن حالة", + "Finished restoring backups. Please wait for indexing to complete.": "اكتملت استعادة النُّسخ الاحتياطية. يُرجى الانتظار حتى تكتمل الفهرسة.", + "First Name": "الاسم الأول", + "Form": "النموذج", + "Form Id": "معرِّف النموذج", + "Form Name": "ﺄﻨﺸﺋ ﺎﺴﻣ", + "Form Title": "ﺄﻨﺸﺋ ﻊﻧﻭﺎﻧ", + "Forms": "النماذج", + "Generate APK/PWA": "إنشاء ملف APK/PWA", + "Generating CSV": "جارٍ إنشاء ملف CSV", + "Geolocation authorized.": "تم منح الإذن بتحديد الموقع الجغرافي.", + "Good": "جيد", + "Grade": "Grade", + "Great": "رائع", + "Great! Use this QR scanner below to scan the code in.": "رائع! استخدِم ماسح رمز الاستجابة السريعة أدناه لمسح الرمز ضوئيًا.", + "Group": "المجموعة", + "Group Created Succesfully": "تم إنشاء المجموعة بنجاح", + "Group Details": "تفاصيل المجموعة", + "Group Name": "اسم المجموعة", + "Grouping Report": "تقرير المجموعات", + "Help": "المساعدة", + "Home": "الصفحة الرئيسية", + "ISSUES": "المشكلات", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "بالنسبة إلى ملف APK (الذي يعمل على كمبيوتر لوحي): ضع الملفات (نسخة احتياطية مشفرة من قاعدة البيانات) أو الدلائل (نسخ احتياطية غير مشفرة من قاعدة البيانات) في Documents/Tangerine/restore directory. اضغط على الزر أدناه لبدء عملية الاستعادة.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "بالنسبة إلى ملف PWA (الذي يعمل على جهاز كمبيوتر و/أو متصفح ويب): اضغط على الزر أدناه واختر الدليل المخزنة فيه ملفات النسخ الاحتياطي. وسيؤدي ذلك إلى بدء عملية الاستعادة.", + "Incomplete": "غير مكتمل", + "Instructions:": "تعليمات:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "إذا ظهر الخطأ 'Is Backup a File?: false'، فهذا يعني أنه ربما تكون لديك نسخة احتياطية من قاعدة بيانات غير مشفرة تقوم بالنسخ الاحتياطي إلى دليل بدلاً من ملف.", + "Item Listing": "ﻕﺎﺌﻣﺓ ﺎﻠﻔﻗﺭﺎﺗ", + "Item Not Found": "ﺎﻠﻔﻗﺭﺓ ﻎﻳﺭ ﻡﻮﺟﻭﺩﺓ", + "Item Title": "ﻊﻧﻭﺎﻧ ﺎﻠﻔﻗﺭﺓ ﺃﻭ ﺎﻠﺒﻧﺩ", + "January": "يناير", + "July": "يوليو", + "June": "يونيو", + "LAST ATTEMPTED": "ﺂﺧﺭ ﻢﺣﺍﻮﻟﺓ", + "LOGIN": "ﺖﺴﺠﻴﻟ ﺎﻟﺪﺧﻮﻟ", + "Last Name": "الاسم الأخير", + "Last Successful Sync Timestamp": "ﺂﺧﺭ ﻢﺣﺍﻮﻟﺓ ﻥﺎﺠﺣﺓ ﻞﺘﻧﺰﻴﻟ ﻮﺗﺯﺎﻤﻧ ﺎﻠﺒﻳﺎﻧﺎﺗ", + "Last attempted cannot be before an item marked.": "لا يمكن إجراء آخر محاولة قبل تحديد أحد العناصر.", + "Latitude": "ﺦﻃ ﺎﻠﻋﺮﺿ:", + "Let's get your device set up.": "لنقم بإعداد جهازك.", + "Let's try again.": "لنحاول مرة أخرى.", + "Loading": "ﺝﺍﺭٍ ﺎﻠﺘﺤﻤﻴﻟ...", + "Location": "الموقع", + "Login": "تسجيل الدخول", + "Login Unsuccesful": "ﺖﺴﺠﻴﻟ ﺎﻟﺪﺧﻮﻟ ﻎﻳﺭ ﻥﺎﺠﺣ", + "Logout": "ﺎﻠﺧﺭﻮﺟ", + "Longitude": "ﺦﻃ ﺎﻠﻃﻮﻟ", + "MARK": "تحديد", + "Maintenance": "Maintenance", + "Manage Groups": "إدارة المجموعات", + "Manage Profile": "ﺇﺩﺍﺭﺓ ﺎﻠﻤﻠﻓ ﺎﻠﺸﺨﺼﻳ", + "Manage Users": "إدارة المستخدمين", + "March": "مارس", + "May": "مايو", + "Mediocre": "متوسط", + "Meters": "ﻢﺗﺭ", + "Month": "الشهر", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "ﺲﺟﻼﺘﻳ", + "Name": "الاسم", + "New Case": "حالة جديدة", + "New Event": "فعالية جديدة", + "New Form": "ﺲﺠﻟ ﺝﺪﻳﺩ", + "New Group": "مجموعة جديدة", + "New Item": "ﻒﻗﺭﺓ ﺝﺪﻳﺩﺓ", + "New Password": "ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﺎﻠﺟﺪﻳﺩﺓ", + "New comment by you": "تعليق جديد منك", "Next": "التالي", -"No Data for":"ﻻ ﺐﻳﺎﻧﺎﺗ ﻞـ", -"No Forms Currently Defined":"ﻻ ﻱﻮﺟﺩ ﺲﺟﻼﺗ ﻢﺣﺩﺩﺓ ﺡﺎﻠﻳﺍً", -"No Update":"ﻻ ﻱﻮﺟﺩ ﺖﺣﺪﻴﺛﺎﺗ", -"No changes proposed yet.":"لم يتم اقتراح أي تغييرات حتى الآن.", -"None":"لا شيء", -"Notifications authorized.":"تم منح الإذن بإرسال الإشعارات.", -"November":"نوفمبر", -"Number of responses not uploaded":"ﻢﺤﻤﻟﺓ", -"Number of responses uploaded":"ﺖﺤﻤﻴﻠﻫﺍ", -"Observations":"ﻡﻼﺤﻇﺎﺗ", -"October":"أكتوبر", -"Online Sync":"المزامنة عبر الإنترنت", -"Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.":"تُستخدَم المزامنة عبر الإنترنت عندما يتوفر اتصال بالإنترنت موثوق. إذا لم يكن لديك اتصال بالإنترنت، فاستخدِم علامة التبويب P2P أعلاه لنقل التسجيلات بين الأجهزة القريبة.", -"Open":"ﻒﺘﺣ", -"Open a Case":"فتح حالة", -"Opened":"مفتوح", -"Opening Case...":"جارٍ فتح الحالة...", -"Opening Event Form...":"جارٍ فتح نموذج الفعالية...", -"Opening event...":"جارٍ فتح الفعالية...", -"Optimizing data. This may take several minutes. Please wait...":"تحسين البيانات. قد يستغرق ذلك عدة دقائق. يُرجى الانتظار...", -"Participant ID":"معرِّف المشارك", -"Password":"ﻚﻠﻣﺓ ﺱﺭ", -"Password Reset Unsuccesful":"ﻊﻤﻠﻳﺓ ﺖﻐﻴﻳﺭ ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﻎﻳﺭ ﻥﺎﺠﺣﺓ", -"Password is required":"يلزم إدخال كلمة مرور", -"Passwords do not match":"كلمتا المرور غير متطابقتين", -"Percentage Complete":"ﺎﻠﻨﺴﺑﺓ ﺎﻠﻤﺋﻮﻳﺓ ﻢﻜﺘﻤﻟﺓ", -"Percentage uploaded:":"ﺎﻠﻨﺴﺑﺓ ﺎﻠﻤﺋﻮﻳﺓ ﺎﻠﺘﻳ ﺖﻣ ﺖﺤﻤﻴﻠﻫﺍ:", -"Percentile":"النسبة المئوية", -"Permission Denied.":"تم رفض الإذن.", -"Permission Denied. Login to Continue":"تم رفض الإذن. سجِّل الدخول للمتابعة", -"Persistent storage authorized.":"تم منح الإذن باستخدام وحدة التخزين الثابت.", -"Pick a":"اخترْ", -"Please enter a valid email address":"يُرجى إدخال عنوان بريد إلكتروني صالح", -"Please retry sync. Are you connected to the Internet?":"تُرجى إعادة محاولة المزامنة. هل جهازك متصل بالإنترنت؟", -"Poor":"ضعيف", -"Press the Start button below to transfer records to the server.":"اضغط على زر 'بدء' أدناه لنقل التسجيلات إلى الخادم.", -"Prev":"ﺱﺎﺒﻗ", -"Processing ":"المعالجة ", -"Processing Directory: ":"دليل المعالجة: ", -"Progress":"التقدم", -"Projects":"المشروعات", -"Propose":"اقتراح", -"Proposed":"مقترَح", -"RECOVER ACCOUNT":"ﺎﺴﺘﻋﺍﺩﺓ ﺢﺳﺎﺑ", -"REGISTER":"ﺖﺴﺠﻴﻟ", -"REPORTS":"التقارير", -"RESET":"ﺈﻋﺍﺩﺓ ﺖﻌﻴﻴﻧ", -"RESET PASSWORD":"ﺈﻋﺍﺩﺓ ﺖﻌﻴﻴﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ", -"RESTORE BACKUP":"استعادة النسخة الاحتياطية", -"REVIEW":"مراجعة", -"Ready":"جاهز", -"Rebase issue on current response":"حدثت مشكلة في تغيير العنوان الأساسي في الاستجابة الحالية", -"Release APK to Production":"إصدار ملف APK للإنتاج", -"Release APK to QA":"إصدار ملف APK لتأكيد الجودة", -"Release PWA to Production":"إصدار ملف PWA للإنتاج", -"Release PWA to QA":"إصدار ملف PWA لتأكيد الجودة", -"Reports":"ﺖﻗﺍﺮﻳﺭ", -"Response":"ﺎﺴﺘﺟﺎﺑﺓ", -"Restore Backup":"استعادة النسخة الاحتياطية", -"Results":"النتائج", -"SCHEDULE":"الجدول", -"SCHEDULE VIEW":"طريقة عرض الجدول", -"SEARCH":"بحث", -"SEARCH VIEW":"طريقة عرض البحث", -"START":"ﺎﺑﺩﺃ", -"STOP":"ﺕﻮﻘﻓ", -"SYNC DATA FOR ALL USERS":"ﺕﺯﺎﻤﻧ ﺎﻠﺒﻳﺎﻧﺎﺗ ﻞﺠﻤﻴﻋ ﺎﻠﻤﺴﺘﺧﺪﻤﻴﻧ", -"Save":"ﺢﻔﻇ", -"Save before switching or your changes will be deleted.":"ﺎﺤﻔﻇ ﻖﺒﻟ ﺍﻼﻨﺘﻗﺎﻟ ﺃﻮﺴﻴﺘﻣ ﺡﺬﻓ ﺎﻠﺘﻋﺪﻳﻼﺗ .", -"Saving event...":"جارٍ حفظ الفعالية...", -"Scan Code":"مسح الرمز ضوئيًا", -"School":"ﻡﺩﺮﺳﺓ", -"Score":"الدرجة", -"Screening ID":"معرِّف الفحص", -"Search cases":"البحث في الحالات", -"Searching":"البحث", -"Searching...":"ﺐﺤﺛ..", -"Security question is required":"يلزم إدخال سؤال الأمان", -"Select Form Name":"ﺎﺨﺗﺍﺭ ﺎﺴﻣ ﺎﻠﺴﺠﻟ", -"Select Report":"ﺎﺨﺗﺭ ﺎﻠﺘﻗﺮﻳﺭ", -"Select Student":"تحديد الطالب", -"Select Subtask":"تحديد المهمة الفرعية", -"Select case type":"تحديد نوع الحالة", -"Select one or more":"ﺎﺨﺗﺭ ﻭﺎﺣﺩ ﺃﻭ ﺎﻜﺛﺭ", -"Select only one":"ﺎﺨﺗﺭ ﻭﺎﺣﺩًﺍ ﻒﻘﻃ", -"Select the appropriate case type from the options listed below":"حدِّد نوع الحالة المناسب من الخيارات المدرجة أدناه", -"Select your Username":"ﺎﺨﺗﺭ ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﺎﻠﺧﺎﺻ ﺐﻛ", -"September":"سبتمبر", -"Set a password to administer your device":"قم بإعداد كلمة مرور لإدارة جهازك", -"Settings":"الإعدادات", -"Something went wrong, please try again.":"حدث خطأ ما، تُرجى المحاولة مرة أخرى.", -"Something went wrong; you may not have Internet access.":"حدث خطأ ما، ربما ليس لديك وصول إلى الإنترنت.", -"Start":"بدء", -"Start Time":"وقت البدء", -"Start Time":"ﺎﻠﺣﺎﻟﺓ", -"Status.Concerning":"ﺐﺨﺻﻮﺻ", -"Status.Good":"ﺞﻳﺩ", -"Status.Great":"ﻊﻈﻴﻣ", -"Status.Poor":"ﻒﻘﻳﺭ", -"Student":"ﻁﺎﻠﺑ ", -"Student Dashboard":"ﻝﻮﺣﺓ ﺎﻠﻃﻼﺑ", -"Student Grouping":"ﺖﺠﻤﻴﻋ ﺎﻠﻃﻼﺑ", -"Student Subtest Report":"ﺖﻗﺮﻳﺭ ﺎﻠﻃﺎﻠﺑ ﺎﻠﻓﺮﻌﻳ", -"Students Assessed":"ﺖﻘﻴﻴﻣ ﺎﻠﻃﻼﺑ", -"Students to watch":"الطلاب المطلوب مراقبتهم", -"SubTask Report":"تقرير المهمة الفرعية", -"Submit":"إرسال", -"Submitting...":"جارٍ الإرسال...", -"Subtask":"ﻑﺮﻌﻳﺓ", -"Subtest Name":"ﺎﺴﻣ ﺍﻼﺨﺘﺑﺍﺭ ﺎﻠﻓﺮﻌﻳ", -"Subtest Report":"ﺖﻗﺮﻳﺭ ﺎﻠﻃﺎﻠﺑ ﺎﻠﻓﺮﻌﻳ", -"Success!":"عملية ناجحة!", -"Summary":"ﻢﻠﺨﺻ", -"Support":"الدعم", -"Switch Editor":"ﺖﺸﻐﻴﻟ ﺎﻠﻤﺣﺭﺭ", -"Sync":"ﺕﺯﺎﻤﻧ", -"Sync Successful":"ﺖﻣ ﺎﻠﺗﺯﺎﻤﻧ ﺐﻨﺟﺎﺣ", -"Sync Unsuccessful. Please Retry":"ﺎﻠﺗﺯﺎﻤﻧ ﻎﻳﺭ ﻥﺎﺠﺣ ﻱُﺮﺟﻯ ﺎﻠﻤﺣﺍﻮﻟﺓ ﻒﻴﻣﺍ ﺐﻋﺩ", -"Syncing Status By User":"ﺡﺎﻟﺓ ﺎﻠﻣﺯﺎﻤﻧﺓ ﻢﻧ ﻖﺒﻟ ﺎﻠﻤﺴﺘﺧﺪﻣ", -"Syncing Status Summary":"ﻢﻠﺨﺻ ﺡﺎﻟﺓ ﺎﻠﻣﺯﺎﻤﻧﺓ", -"Tangerine":"Tangerine", -"Tap any boxes that were incorrect during the test.":"ﺎﻨﻗﺭ ﻊﻟﻯ ﺎﻠﻣﺮﺒﻋﺎﺗ ﻎﻳﺭ ﺎﻠﺼﺤﻴﺣﺓ ﺄﺜﻧﺍﺀ ﺍﻼﺨﺘﺑﺍﺭ", -"Tap items to mark them incorrect.":"ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﻔﻗﺭﺎﺗ ﻞﺘﺴﺠﻴﻟ ﺍﻺﺟﺎﺑﺎﺗ ﻎﻳﺭ ﺺﺤﻴﺣﺓ .", -"Tap the item last attempted.":"ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﻤﺣﺍﻮﻟﺓ ﺍﻸﺨﻳﺭﺓ ﻞﻠﻔﻗﺭﺓ ﺃﻭ ﺎﻠﻌﻨﺻﺭ.", -"Task Report":"تقرير المهمة", -"That's ok. Enter the device ID and token below.":"هذا جيد. أدخِل معرِّف الجهاز والرمز المميز أدناه.", -"The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"سيتحقق التطبيق الآن من وجود تحديث وسيحاول تنزيله. يُرجى إبقاء جهازك متصلاً بالإنترنت خلال هذه العملية. اضغط على 'موافق' للمتابعة.", -"The date cannot be in the future. Please enter a date that is on or before today.":"لا يمكن أن يكون التاريخ في المستقبل. يُرجى إدخال تاريخ اليوم أو يوم سابق.", -"The date is missing. Please enter a valid date.":"التاريخ مفقود. يُرجى إدخال تاريخ صالح.", -"The date is not valid. Please enter a valid date.":"التاريخ غير صالح. يُرجى إدخال تاريخ صالح.", -"The form is not yet complete. Are you sure you would like to exit the form?":"لم يكتمل النموذج بعدُ. هل تريد بالتأكيد الخروج من النموذج؟", -"There is unsaved data. Are you sure you would like to exit the form?":"توجد بيانات غير محفوظة. هل تريد بالتأكيد الخروج من النموذج؟", -"This Field is Required":"هذا الحقل إلزامي", -"This feature copies backup databases to the Tangerine application.":"تقوم هذه الميزة بنسخ قواعد بيانات النسخ الاحتياطي إلى تطبيق Tangerine.", -"Tips":"ﻦﺻﺎﺌﺣ", -"Today":"اليوم", -"Total":"الإجمالي", -"Total Docs Uploaded":"ﻢﺠﻣﻮﻋ ﺎﻠﻤﻠﻓﺎﺗ ﺎﻠﺘﻳ ﺖﻣ ﺖﺤﻤﻴﻠﻫﺍ", -"Total Docs not Uploaded":"ﻢﺠﻣﻮﻋ ﺎﻠﻤﻠﻓﺎﺗ ﻎﻳﺭ ﺎﻠﻤﺤﻤﻟﺓ", -"Total Percentage Complete":"ﻢﺠﻣﻮﻋ ﺎﻠﻨﺴﺑ ﺎﻠﻤﺋﻮﻳﺓ ﺎﻠﻤﻜﺘﻤﻟﺓ", -"Total Updates Applied":"ﻢﺠﻣﻮﻋ ﺎﻠﺘﺣﺪﻴﺛﺎﺗ ﺎﻠﺘﻳ ﺖﻣ ﺖﻄﺒﻴﻘﻫﺍ", -"Totals":"ﺎﻠﻤﺟﺎﻤﻴﻋ", -"Troubleshooting:":"استكشاف الأخطاء وإصلاحها:", -"Try moving outside with a clear view of the sky":"حاوِل الانتقال إلى الخارج مع إظهار السماء بوضوح", -"Try standing away from trees or buildings":"ﺡﺍﻮﻟ ﺎﻟﻮﻗﻮﻓ ﺐﻌﻳﺩﺍً ﻊﻧ ﺍﻸﺸﺟﺍﺭ ﺃﻭ ﺎﻠﺒﻧﺎﻳﺎﺗ", -"Try standing next to a window":"ﺡﺍﻮﻟ ﺎﻟﻮﻗﻮﻓ ﺐﺟﺎﻨﺑ ﺎﻠﻧﺎﻓﺫﺓ", -"Unable to check for update. Make sure you are connected to the Internet and try again.":"يتعذر التحقق من وجود تحديث. تأكد من اتصال جهازك بالإنترنت وحاول مرة أخرى.", -"Unassigned Category":"ﻢﺨﺼﺻﺓ", -"Unknown":"غير معروف", -"Update App":"ﺖﺣﺪﻴﺛ ﺎﻠﺘﻄﺒﻴﻗ", -"Update is Running. Please Wait ...":"ﺎﻠﺘﺣﺪﻴﺛ ﺝﺍﺭ. ﺃﺮﺟﻭ ﺍﻼﻨﺘﻇﺍﺭ...", -"Updating...":"ﺖﺣﺪﻴﺛ", -"User Added to Group Successfully":"تمت إضافة المستخدم إلى المجموعة بنجاح", -"User Created Succesfully":"تم إنشاء المستخدم بنجاح", -"User Removed from Group Successfully":"تم حذف المستخدم من المجموعة بنجاح", -"Username":"ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ", -"Username Available":"ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﻢﺗﺎﺣ", -"Username Unavailable":"ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﻎﻳﺭ ﻢﺗﺎﺣ", -"Username is required":"يلزم إدخال اسم المستخدم", -"View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'":"اعرض سجل العملية. انتظر حتى يتم نسخ كل الملفات. عندما يكتمل النسخ، سيتم عرض الرسالة 'يُرجى الخروج من التطبيق وإعادة التشغيل'.", -"View your PWA":"عرض ملف PWA", -"Visits":"ﺎﻟﺰﻳﺍﺭﺎﺗ", -"Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?":"تحذير: قد يؤدي انقطاع العملية إلى تلف البيانات أو فقدانها. هل أنت متأكد من أنك تريد المتابعة؟", -"We will now prompt for a series of permissions. Click next and then allow each permission.":"سنطلب الآن مجموعة من الأذونات. انقر فوق 'التالي' ثم اسمح بكل إذن.", -"Week View":"عرض الأسبوع", -"When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.":"عندما تفتح هذه الصفحة، تتحقق من وجود دليل مستندات وتنشئ النُّسخ الاحتياطية ودلائل الاستعادة اللازمة لتطبيق Tangerine. وإذا لم يتوفر دليل المستندات، فسيتم عرض رسالة خطأ أدناه. يمكنك استخدام مدير ملفات الجهاز (أو تنزيل Google Files) لإنشاء دليل المستندات في وحدة التخزين الداخلية.", -"Would you like to update? We recommend syncing data before you do.":"هل تريد التحديث؟ نوصي بمزامنة البيانات قبل التحديث.", -"Write Failed":"فشلت عملية الكتابة", -"Year":"العام", -"You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.":"لا يمكنك دمج التغييرات المقترَحة لأنه تم تحديث استجابة النموذج منذ ظهور المشكلة. اقترِح تغييرًا جديدًا استنادًا إلى الإصدار الحالي لاستجابة النموذج.", -"You do not have access to the resource.":"ليس لديك حق الوصول إلى المصدر.", -"You have not started this event":"أنت لم تبدأ هذه الفعالية", -"You have not started this form":"أنت لم تبدأ هذا النموذج", -"You may not mark an item incorrect that is beyond the last item attempted.":" ﻻ ﻲﺟﻭﺯ ﻞﻛ ﻮﻀﻋ ﻉﻼﻣﺓ ﻊﻟﻯ ﻊﻨﺻﺭ ﻎﻳﺭ ﺺﺤﻴﺣ ﻲﺘﻋﺩﻯ ﺎﻠﺒﻧﺩ ﺍﻸﺨﻳﺭ.", -"You may proceed.":"ﺏﺈﻤﻛﺎﻨﻛ ﺎﻠﻤﺗﺎﺒﻋﺓ.", -"Your APK is building...":"جارٍ إنشاء ملف APK الخاص بك...", -"Your PWA is building...":"جارٍ إنشاء ملف PWA الخاص بك...", -"accept":"قبول", -"and":"و", -"Back":"رجوع", -"by":"حسب", -"cancel":"إلغاء", -"changes":"التغييرات", -"clear":"مسح", -"close":"إغلاق", -"closed":"مغلَق", -"comment":"تعليق", -"continue":"متابعة", -"events":"الفعاليات", -"here":"هنا", -"issue rebased on updated response":"حدثت مشكلة في تغيير العنوان الأساسي في الاستجابة المحدَّثة", -"latitude":"خط العرض", -"loading":"التحميل", -"longitude":"خط الطول", -"manifest":"البيان", -"merged":"مُدمجة", -"new case":"حالة جديدة", -"new issue":"مشكلة جديدة", - "Next": "التالي", -"no":"لا", -"no, stop":"لا", -"open":"فتح", -"open cases":"فتح الحالات", -"opened":"مفتوح", -"proposed changes merged":"التغييرات المقترَحة المدمجة", -"response":"الاستجابة", -"review case":"مراجعة الحالة", -"review form":"مراجعة النموذج", -"revision":"المراجعة", -"revisions":"المراجعات", -"save":"حفظ", -"scan":"مسح ضوئي", -"searching":"البحث", -"see form":"الاطّلاع على النموذج", -"start another":"بدء نموذج آخر", -"start event":"بدء الفعالية", -"start form":"بدء النموذج", -"submit":"ﺢﻔﻇ", -"summary":"الملخص", -"updated settings":"الإعدادات المحدَّثة", -"yes":"نعم", -"yes, continue":"نعم", -"✓ Yay! You are up to date.":"✓ ﻭﺍﻭ! ﺖﻣ ﺎﻠﺘﺣﺪﻴﺛ.", -"✓ Yay, You are up to date.":"✓ مرحى، تم التحديث." -} + "No Data for": "ﻻ ﺐﻳﺎﻧﺎﺗ ﻞـ", + "No Forms Currently Defined": "ﻻ ﻱﻮﺟﺩ ﺲﺟﻼﺗ ﻢﺣﺩﺩﺓ ﺡﺎﻠﻳﺍً", + "No Students currently registered.": "No Students currently registered.", + "No Update": "ﻻ ﻱﻮﺟﺩ ﺖﺣﺪﻴﺛﺎﺗ", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "لم يتم اقتراح أي تغييرات حتى الآن.", + "None": "لا شيء", + "Notifications authorized.": "تم منح الإذن بإرسال الإشعارات.", + "November": "نوفمبر", + "Number of responses not uploaded": "ﻢﺤﻤﻟﺓ", + "Number of responses uploaded": "ﺖﺤﻤﻴﻠﻫﺍ", + "Observations": "ﻡﻼﺤﻇﺎﺗ", + "October": "أكتوبر", + "Online Sync": "المزامنة عبر الإنترنت", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "تُستخدَم المزامنة عبر الإنترنت عندما يتوفر اتصال بالإنترنت موثوق. إذا لم يكن لديك اتصال بالإنترنت، فاستخدِم علامة التبويب P2P أعلاه لنقل التسجيلات بين الأجهزة القريبة.", + "Open": "ﻒﺘﺣ", + "Open a Case": "فتح حالة", + "Opened": "مفتوح", + "Opening Case...": "جارٍ فتح الحالة...", + "Opening Event Form...": "جارٍ فتح نموذج الفعالية...", + "Opening event...": "جارٍ فتح الفعالية...", + "Optimizing data. This may take several minutes. Please wait...": "تحسين البيانات. قد يستغرق ذلك عدة دقائق. يُرجى الانتظار...", + "Participant ID": "معرِّف المشارك", + "Password": "ﻚﻠﻣﺓ ﺱﺭ", + "Password Reset Unsuccesful": "ﻊﻤﻠﻳﺓ ﺖﻐﻴﻳﺭ ﻚﻠﻣﺓ ﺎﻠﺳﺭ ﻎﻳﺭ ﻥﺎﺠﺣﺓ", + "Password is required": "يلزم إدخال كلمة مرور", + "Passwords do not match": "كلمتا المرور غير متطابقتين", + "Percentage Complete": "ﺎﻠﻨﺴﺑﺓ ﺎﻠﻤﺋﻮﻳﺓ ﻢﻜﺘﻤﻟﺓ", + "Percentage uploaded:": "ﺎﻠﻨﺴﺑﺓ ﺎﻠﻤﺋﻮﻳﺓ ﺎﻠﺘﻳ ﺖﻣ ﺖﺤﻤﻴﻠﻫﺍ:", + "Percentile": "النسبة المئوية", + "Permission Denied.": "تم رفض الإذن.", + "Permission Denied. Login to Continue": "تم رفض الإذن. سجِّل الدخول للمتابعة", + "Persistent storage authorized.": "تم منح الإذن باستخدام وحدة التخزين الثابت.", + "Pick a": "اخترْ", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "يُرجى إدخال عنوان بريد إلكتروني صالح", + "Please retry sync. Are you connected to the Internet?": "تُرجى إعادة محاولة المزامنة. هل جهازك متصل بالإنترنت؟", + "Poor": "ضعيف", + "Press the Start button below to transfer records to the server.": "اضغط على زر 'بدء' أدناه لنقل التسجيلات إلى الخادم.", + "Prev": "ﺱﺎﺒﻗ", + "Processing ": "المعالجة ", + "Processing Directory: ": "دليل المعالجة: ", + "Progress": "التقدم", + "Projects": "المشروعات", + "Propose": "اقتراح", + "Proposed": "مقترَح", + "RECOVER ACCOUNT": "ﺎﺴﺘﻋﺍﺩﺓ ﺢﺳﺎﺑ", + "REGISTER": "ﺖﺴﺠﻴﻟ", + "REPORTS": "التقارير", + "RESET": "ﺈﻋﺍﺩﺓ ﺖﻌﻴﻴﻧ", + "RESET PASSWORD": "ﺈﻋﺍﺩﺓ ﺖﻌﻴﻴﻧ ﻚﻠﻣﺓ ﺎﻠﺳﺭ", + "RESTORE BACKUP": "استعادة النسخة الاحتياطية", + "REVIEW": "مراجعة", + "Ready": "جاهز", + "Rebase issue on current response": "حدثت مشكلة في تغيير العنوان الأساسي في الاستجابة الحالية", + "Release APK to Production": "إصدار ملف APK للإنتاج", + "Release APK to QA": "إصدار ملف APK لتأكيد الجودة", + "Release PWA to Production": "إصدار ملف PWA للإنتاج", + "Release PWA to QA": "إصدار ملف PWA لتأكيد الجودة", + "Report": "Report", + "Report for": "Report for", + "Reports": "ﺖﻗﺍﺮﻳﺭ", + "Response": "ﺎﺴﺘﺟﺎﺑﺓ", + "Restore Backup": "استعادة النسخة الاحتياطية", + "Results": "النتائج", + "SCHEDULE": "الجدول", + "SCHEDULE VIEW": "طريقة عرض الجدول", + "SEARCH": "بحث", + "SEARCH VIEW": "طريقة عرض البحث", + "START": "ﺎﺑﺩﺃ", + "STOP": "ﺕﻮﻘﻓ", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "ﺕﺯﺎﻤﻧ ﺎﻠﺒﻳﺎﻧﺎﺗ ﻞﺠﻤﻴﻋ ﺎﻠﻤﺴﺘﺧﺪﻤﻴﻧ", + "Save": "ﺢﻔﻇ", + "Save before switching or your changes will be deleted.": "ﺎﺤﻔﻇ ﻖﺒﻟ ﺍﻼﻨﺘﻗﺎﻟ ﺃﻮﺴﻴﺘﻣ ﺡﺬﻓ ﺎﻠﺘﻋﺪﻳﻼﺗ .", + "Saving event...": "جارٍ حفظ الفعالية...", + "Scan Code": "مسح الرمز ضوئيًا", + "School": "ﻡﺩﺮﺳﺓ", + "Score": "الدرجة", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "معرِّف الفحص", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "البحث في الحالات", + "Searching": "البحث", + "Searching...": "ﺐﺤﺛ..", + "Security question is required": "يلزم إدخال سؤال الأمان", + "Select Form Name": "ﺎﺨﺗﺍﺭ ﺎﺴﻣ ﺎﻠﺴﺠﻟ", + "Select Report": "ﺎﺨﺗﺭ ﺎﻠﺘﻗﺮﻳﺭ", + "Select Student": "تحديد الطالب", + "Select Subtask": "تحديد المهمة الفرعية", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "تحديد نوع الحالة", + "Select one or more": "ﺎﺨﺗﺭ ﻭﺎﺣﺩ ﺃﻭ ﺎﻜﺛﺭ", + "Select only one": "ﺎﺨﺗﺭ ﻭﺎﺣﺩًﺍ ﻒﻘﻃ", + "Select the appropriate case type from the options listed below": "حدِّد نوع الحالة المناسب من الخيارات المدرجة أدناه", + "Select your Username": "ﺎﺨﺗﺭ ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﺎﻠﺧﺎﺻ ﺐﻛ", + "September": "سبتمبر", + "Set a password to administer your device": "قم بإعداد كلمة مرور لإدارة جهازك", + "Settings": "الإعدادات", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "حدث خطأ ما، تُرجى المحاولة مرة أخرى.", + "Something went wrong; you may not have Internet access.": "حدث خطأ ما، ربما ليس لديك وصول إلى الإنترنت.", + "Start": "بدء", + "Start Date": "Start Date", + "Start Time": "ﺎﻠﺣﺎﻟﺓ", + "Status": "Status", + "Status.Concerning": "ﺐﺨﺻﻮﺻ", + "Status.Good": "ﺞﻳﺩ", + "Status.Great": "ﻊﻈﻴﻣ", + "Status.Poor": "ﻒﻘﻳﺭ", + "Stud.": "Stud.", + "Student": "ﻁﺎﻠﺑ ", + "Student Dashboard": "ﻝﻮﺣﺓ ﺎﻠﻃﻼﺑ", + "Student Grouping": "ﺖﺠﻤﻴﻋ ﺎﻠﻃﻼﺑ", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "ﺖﻗﺮﻳﺭ ﺎﻠﻃﺎﻠﺑ ﺎﻠﻓﺮﻌﻳ", + "Students Assessed": "ﺖﻘﻴﻴﻣ ﺎﻠﻃﻼﺑ", + "Students to watch": "الطلاب المطلوب مراقبتهم", + "SubTask Report": "تقرير المهمة الفرعية", + "Subject scores": "Subject scores", + "Submit": "إرسال", + "Submitting...": "جارٍ الإرسال...", + "Subtask": "ﻑﺮﻌﻳﺓ", + "Subtest Name": "ﺎﺴﻣ ﺍﻼﺨﺘﺑﺍﺭ ﺎﻠﻓﺮﻌﻳ", + "Subtest Report": "ﺖﻗﺮﻳﺭ ﺎﻠﻃﺎﻠﺑ ﺎﻠﻓﺮﻌﻳ", + "Success!": "عملية ناجحة!", + "Summary": "ﻢﻠﺨﺻ", + "Support": "الدعم", + "Switch Editor": "ﺖﺸﻐﻴﻟ ﺎﻠﻤﺣﺭﺭ", + "Sync": "ﺕﺯﺎﻤﻧ", + "Sync Successful": "ﺖﻣ ﺎﻠﺗﺯﺎﻤﻧ ﺐﻨﺟﺎﺣ", + "Sync Unsuccessful. Please Retry": "ﺎﻠﺗﺯﺎﻤﻧ ﻎﻳﺭ ﻥﺎﺠﺣ ﻱُﺮﺟﻯ ﺎﻠﻤﺣﺍﻮﻟﺓ ﻒﻴﻣﺍ ﺐﻋﺩ", + "Syncing Status By User": "ﺡﺎﻟﺓ ﺎﻠﻣﺯﺎﻤﻧﺓ ﻢﻧ ﻖﺒﻟ ﺎﻠﻤﺴﺘﺧﺪﻣ", + "Syncing Status Summary": "ﻢﻠﺨﺻ ﺡﺎﻟﺓ ﺎﻠﻣﺯﺎﻤﻧﺓ", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "ﺎﻨﻗﺭ ﻊﻟﻯ ﺎﻠﻣﺮﺒﻋﺎﺗ ﻎﻳﺭ ﺎﻠﺼﺤﻴﺣﺓ ﺄﺜﻧﺍﺀ ﺍﻼﺨﺘﺑﺍﺭ", + "Tap items to mark them incorrect.": "ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﻔﻗﺭﺎﺗ ﻞﺘﺴﺠﻴﻟ ﺍﻺﺟﺎﺑﺎﺗ ﻎﻳﺭ ﺺﺤﻴﺣﺓ .", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "ﺎﻀﻐﻃ ﻊﻟﻯ ﺎﻠﻤﺣﺍﻮﻟﺓ ﺍﻸﺨﻳﺭﺓ ﻞﻠﻔﻗﺭﺓ ﺃﻭ ﺎﻠﻌﻨﺻﺭ.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "تقرير المهمة", + "That's ok. Enter the device ID and token below.": "هذا جيد. أدخِل معرِّف الجهاز والرمز المميز أدناه.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "سيتحقق التطبيق الآن من وجود تحديث وسيحاول تنزيله. يُرجى إبقاء جهازك متصلاً بالإنترنت خلال هذه العملية. اضغط على 'موافق' للمتابعة.", + "The date cannot be in the future. Please enter a date that is on or before today.": "لا يمكن أن يكون التاريخ في المستقبل. يُرجى إدخال تاريخ اليوم أو يوم سابق.", + "The date is missing. Please enter a valid date.": "التاريخ مفقود. يُرجى إدخال تاريخ صالح.", + "The date is not valid. Please enter a valid date.": "التاريخ غير صالح. يُرجى إدخال تاريخ صالح.", + "The form is not yet complete. Are you sure you would like to exit the form?": "لم يكتمل النموذج بعدُ. هل تريد بالتأكيد الخروج من النموذج؟", + "There is unsaved data. Are you sure you would like to exit the form?": "توجد بيانات غير محفوظة. هل تريد بالتأكيد الخروج من النموذج؟", + "This Field is Required": "هذا الحقل إلزامي", + "This feature copies backup databases to the Tangerine application.": "تقوم هذه الميزة بنسخ قواعد بيانات النسخ الاحتياطي إلى تطبيق Tangerine.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "ﻦﺻﺎﺌﺣ", + "Today": "اليوم", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "الإجمالي", + "Total Docs Uploaded": "ﻢﺠﻣﻮﻋ ﺎﻠﻤﻠﻓﺎﺗ ﺎﻠﺘﻳ ﺖﻣ ﺖﺤﻤﻴﻠﻫﺍ", + "Total Docs not Uploaded": "ﻢﺠﻣﻮﻋ ﺎﻠﻤﻠﻓﺎﺗ ﻎﻳﺭ ﺎﻠﻤﺤﻤﻟﺓ", + "Total Percentage Complete": "ﻢﺠﻣﻮﻋ ﺎﻠﻨﺴﺑ ﺎﻠﻤﺋﻮﻳﺓ ﺎﻠﻤﻜﺘﻤﻟﺓ", + "Total Updates Applied": "ﻢﺠﻣﻮﻋ ﺎﻠﺘﺣﺪﻴﺛﺎﺗ ﺎﻠﺘﻳ ﺖﻣ ﺖﻄﺒﻴﻘﻫﺍ", + "Totals": "ﺎﻠﻤﺟﺎﻤﻴﻋ", + "Troubleshooting:": "استكشاف الأخطاء وإصلاحها:", + "Try moving outside with a clear view of the sky": "حاوِل الانتقال إلى الخارج مع إظهار السماء بوضوح", + "Try standing away from trees or buildings": "ﺡﺍﻮﻟ ﺎﻟﻮﻗﻮﻓ ﺐﻌﻳﺩﺍً ﻊﻧ ﺍﻸﺸﺟﺍﺭ ﺃﻭ ﺎﻠﺒﻧﺎﻳﺎﺗ", + "Try standing next to a window": "ﺡﺍﻮﻟ ﺎﻟﻮﻗﻮﻓ ﺐﺟﺎﻨﺑ ﺎﻠﻧﺎﻓﺫﺓ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "يتعذر التحقق من وجود تحديث. تأكد من اتصال جهازك بالإنترنت وحاول مرة أخرى.", + "Unassigned Category": "ﻢﺨﺼﺻﺓ", + "Unit Report": "Unit Report", + "Unknown": "غير معروف", + "Update App": "ﺖﺣﺪﻴﺛ ﺎﻠﺘﻄﺒﻴﻗ", + "Update is Running. Please Wait ...": "ﺎﻠﺘﺣﺪﻴﺛ ﺝﺍﺭ. ﺃﺮﺟﻭ ﺍﻼﻨﺘﻇﺍﺭ...", + "Updating": "Updating", + "Updating...": "ﺖﺣﺪﻴﺛ", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "تمت إضافة المستخدم إلى المجموعة بنجاح", + "User Created Succesfully": "تم إنشاء المستخدم بنجاح", + "User Removed from Group Successfully": "تم حذف المستخدم من المجموعة بنجاح", + "Username": "ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ", + "Username Available": "ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﻢﺗﺎﺣ", + "Username Unavailable": "ﺎﺴﻣ ﺎﻠﻤﺴﺘﺧﺪﻣ ﻎﻳﺭ ﻢﺗﺎﺣ", + "Username is required": "يلزم إدخال اسم المستخدم", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "اعرض سجل العملية. انتظر حتى يتم نسخ كل الملفات. عندما يكتمل النسخ، سيتم عرض الرسالة 'يُرجى الخروج من التطبيق وإعادة التشغيل'.", + "View your PWA": "عرض ملف PWA", + "Visits": "ﺎﻟﺰﻳﺍﺭﺎﺗ", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "تحذير: قد يؤدي انقطاع العملية إلى تلف البيانات أو فقدانها. هل أنت متأكد من أنك تريد المتابعة؟", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "سنطلب الآن مجموعة من الأذونات. انقر فوق 'التالي' ثم اسمح بكل إذن.", + "Week View": "عرض الأسبوع", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "عندما تفتح هذه الصفحة، تتحقق من وجود دليل مستندات وتنشئ النُّسخ الاحتياطية ودلائل الاستعادة اللازمة لتطبيق Tangerine. وإذا لم يتوفر دليل المستندات، فسيتم عرض رسالة خطأ أدناه. يمكنك استخدام مدير ملفات الجهاز (أو تنزيل Google Files) لإنشاء دليل المستندات في وحدة التخزين الداخلية.", + "Would you like to update? We recommend syncing data before you do.": "هل تريد التحديث؟ نوصي بمزامنة البيانات قبل التحديث.", + "Write Failed": "فشلت عملية الكتابة", + "Year": "العام", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "لا يمكنك دمج التغييرات المقترَحة لأنه تم تحديث استجابة النموذج منذ ظهور المشكلة. اقترِح تغييرًا جديدًا استنادًا إلى الإصدار الحالي لاستجابة النموذج.", + "You do not have access to the resource.": "ليس لديك حق الوصول إلى المصدر.", + "You have not started this event": "أنت لم تبدأ هذه الفعالية", + "You have not started this form": "أنت لم تبدأ هذا النموذج", + "You may not mark an item incorrect that is beyond the last item attempted.": " ﻻ ﻲﺟﻭﺯ ﻞﻛ ﻮﻀﻋ ﻉﻼﻣﺓ ﻊﻟﻯ ﻊﻨﺻﺭ ﻎﻳﺭ ﺺﺤﻴﺣ ﻲﺘﻋﺩﻯ ﺎﻠﺒﻧﺩ ﺍﻸﺨﻳﺭ.", + "You may proceed.": "ﺏﺈﻤﻛﺎﻨﻛ ﺎﻠﻤﺗﺎﺒﻋﺓ.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "جارٍ إنشاء ملف APK الخاص بك...", + "Your PWA is building...": "جارٍ إنشاء ملف PWA الخاص بك...", + "accept": "قبول", + "and": "و", + "back": "back", + "by": "حسب", + "cancel": "إلغاء", + "changes": "التغييرات", + "clear": "مسح", + "close": "إغلاق", + "closed": "مغلَق", + "comment": "تعليق", + "continue": "متابعة", + "events": "الفعاليات", + "here": "هنا", + "issue rebased on updated response": "حدثت مشكلة في تغيير العنوان الأساسي في الاستجابة المحدَّثة", + "latitude": "خط العرض", + "loading": "التحميل", + "longitude": "خط الطول", + "manifest": "البيان", + "merged": "مُدمجة", + "new case": "حالة جديدة", + "new form": "new form", + "new issue": "مشكلة جديدة", + "next": "next", + "no": "لا", + "no, stop": "لا", + "open": "فتح", + "open cases": "فتح الحالات", + "opened": "مفتوح", + "proposed changes merged": "التغييرات المقترَحة المدمجة", + "response": "الاستجابة", + "result": "result", + "review case": "مراجعة الحالة", + "review form": "مراجعة النموذج", + "revision": "المراجعة", + "revisions": "المراجعات", + "save": "حفظ", + "scan": "مسح ضوئي", + "searching": "البحث", + "see form": "الاطّلاع على النموذج", + "start another": "بدء نموذج آخر", + "start event": "بدء الفعالية", + "start form": "بدء النموذج", + "submit": "ﺢﻔﻇ", + "summary": "الملخص", + "updated settings": "الإعدادات المحدَّثة", + "yes": "نعم", + "yes, continue": "نعم", + "✓ Yay! You are up to date.": "✓ ﻭﺍﻭ! ﺖﻣ ﺎﻠﺘﺣﺪﻴﺛ.", + "✓ Yay, You are up to date.": "✓ مرحى، تم التحديث." +} \ No newline at end of file diff --git a/translations/translation.KH_km.json b/translations/translation.KH_km.json index 498ed0213f..ba95a0f338 100644 --- a/translations/translation.KH_km.json +++ b/translations/translation.KH_km.json @@ -13,33 +13,46 @@ "Add New User": "បន្ថែមអ្នកប្រើប្រាស់ថ្មី", "Add Student": "Add Student", "Add User to Group": "បន្ថែមអ្នកប្រើប្រាស់ក្នុងក្រុម", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "អ្នកអាចធ្វើបច្ចុប្បន្នភាពបាន។ ដំបូងអ្នកត្រូវបញូនទិន្នន័យសិន មុននឹងដំឡើងកម្មវិធីបច្ចុប្បន្នភាព។ ប្រសិនបើអ្នកមិនអនុវត្តនោះទេ សូមចុចពាក្យ ចាកចេញ ។ ប្រសិនបើអ្នករួចរាល់ដើម្បីដំឡើងបច្ចុប្បន្នភាព សូមចុចពាក្យ បាទ/ចាស។ ", "Applying Updates...": "កំពុងធ្វើបច្ចុប្បន្នភាព...", "April": "April", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "តើអ្នកប្រាកដឬទេដែលចង់ចាប់ផ្តើមទម្រង់ឆ្លើយសំណួរនេះ?", "Are you sure you would like to exit the form?": "តើអ្នកប្រាកដឬទេ ដែលចង់ចាកចេញពីទម្រង់នេះ?", + "Attend.": "Attend.", + "Attendance": "Attendance", "August": "August", "Average": "Average", "Average Correct": "Average Correct", "Average Correct (%)": "Average Correct (%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Case", "Cases": "Cases", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "ពិនិត្យមើល ការធ្វើបច្ចុប្បន្នភាព", "Checking": "Checking", "Checking For Updates...": "កំពុងពិនិត្យមើល ការធ្វើបច្ចុប្បន្នភាព...", "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", "Choose type...": "Choose type...", "Choose which case type": "Choose which case type", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "Class Grouping", "Class Size": "Class Size", "Class grouping": "Class grouping", + "Classes": "Classes", "Click a Picture": "ចុចរូបភាព", "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", "Click the play button to get started.": "ចុចប៊ូតុង លេង ដើម្បីចាប់ផ្តើម។", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "ចុចដើម្បីទាញយក", "Close": "បិទ", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -62,7 +75,10 @@ "Creating new case...": "Creating new case...", "Current": "Current", "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", "Date and Time": "កាលបរិច្ឆេទ និង ពេលវេលា", "Day": "Day", "Day View": "Day View", @@ -80,9 +96,11 @@ "EXPORT DATA FOR ALL USERS": "រុញចេញទិន្នន័យទៅអ្នកប្រើប្រាស់", "Edit Item": "ធាតុ កែប្រែ", "Email": "អ៊ីមែល", + "End Date": "End Date", "Enter your response to above question here": "បញ្ចូលចម្លើយរបស់អ្នកនៅទីនេះ", "Error Downloading File": "ការទាញយកឯកសារមានកំហុស", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "Event", "Export Backup": "Export Backup", "Export Data": "រុញចេញទិន្នន័យ", @@ -105,6 +123,7 @@ "Generating CSV": "កំពុងបង្កើត CSV", "Geolocation authorized.": "Geolocation authorized.", "Good": "Good", + "Grade": "Grade", "Great": "Great", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "ក្រុម", @@ -141,6 +160,7 @@ "Logout": "ចេញ", "Longitude": "រយ:បណ្តោយ", "MARK": "សញ្ញាពិន្ទុ", + "Maintenance": "Maintenance", "Manage Groups": "គ្រប់គ្រងក្រុម", "Manage Profile": "គ្រប់គ្រងទម្រង់", "Manage Users": "គ្រប់គ្រងអ្នកប្រើប្រាស់", @@ -149,6 +169,8 @@ "Mediocre": "Mediocre", "Meters": "ម៉ែត្រ", "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "ទម្រង់របស់ខ្ញុំ", "Name": "Name", "New Case": "New Case", @@ -161,7 +183,9 @@ "Next": "Next", "No Data for": "មិនមានទិន្នន័យទេ", "No Forms Currently Defined": "មិនមានទម្រង់ដូចបានកំណត់ទេ", + "No Students currently registered.": "No Students currently registered.", "No Update": "មិនមានធ្វើបច្ចុប្បន្នភាពទេ", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "None", "Notifications authorized.": "Notifications authorized.", @@ -191,6 +215,7 @@ "Permission Denied. Login to Continue": "មិនមានការអនុញាត។ ចូលបន្ត", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "ជ្រើសរើស a", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "សូមបញ្ចូលអ៊ីមែលដែលត្រឹមត្រូវ", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "Poor", @@ -215,6 +240,8 @@ "Release APK to QA": "ចេញផ្សាយ APK ទៅ QA", "Release PWA to Production": "ចេញផ្សាយ PWA ទៅ ផលិតកម្ម", "Release PWA to QA": "ចេញផ្សាយ PWA ទៅ QA", + "Report": "Report", + "Report for": "Report for", "Reports": "របាយការណ៍ផ្សេងៗ", "Response": "ចម្លើយ", "Restore Backup": "Restore Backup", @@ -225,6 +252,7 @@ "SEARCH VIEW": "SEARCH VIEW", "START": "ចាប់ផ្តើម", "STOP": "ឈប់", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "បញ្ជូនទិន្នន័យទៅអ្នកប្រើប្រាស់", "Save": "រក្សាទុក", "Save before switching or your changes will be deleted.": "រក្សាទុកមុនពេលប្តូរ បើមិនដូច្នេះទេ ការផ្លាស់ប្តូររបស់អ្នកត្រូវបានលុបចោល", @@ -232,7 +260,13 @@ "Scan Code": "Scan Code", "School": "សាលារៀន", "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "Search cases", "Searching": "កំពុងរុករក", "Searching...": "Searching...", @@ -241,6 +275,9 @@ "Select Report": "Select Report", "Select Student": "Select Student", "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "ជ្រើសរើសមួយ ឬច្រើន", "Select only one": "ជ្រើសរើសបានតែមួយគត់", @@ -249,22 +286,29 @@ "September": "September", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Settings", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Start", + "Start Date": "Start Date", "Start Time": "ម៉ោង ចាប់ផ្តើម", "Status": "Status", "Status.Concerning": "Status.Concerning", "Status.Good": "Status.Good", "Status.Great": "Status.Great", "Status.Poor": "Status.Poor", + "Stud.": "Stud.", "Student": "Student", "Student Dashboard": "Student Dashboard", "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "Student Subtest Report", "Students Assessed": "Students Assessed", "Students to watch": "Students to watch", "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", "Submit": "Submit", "Submitting...": "Submitting...", "Subtask": "Subtask", @@ -282,7 +326,9 @@ "Tangerine": "តែនជើរីន", "Tap any boxes that were incorrect during the test.": "ចុចប្រអប់ណាមួយដែលមិនត្រឹមត្រូវ ក្នុងអំឡុងពេលធ្វើតេស្ត", "Tap items to mark them incorrect.": "ចុចធាតុទាំងឡាយដើម្បីកំណត់ពិន្ទុមិនត្រឹមត្រូវ", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "ចុចធាតុប៉ុនប៉ងចុងក្រោយ", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "Task Report", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.", @@ -293,8 +339,11 @@ "There is unsaved data. Are you sure you would like to exit the form?": "There is unsaved data. Are you sure you would like to exit the form?", "This Field is Required": "ចំណុចនេះត្រូវតែបំពេញ", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "ព័ត៍មានជំនួយ", "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "សរុប", "Total Docs Uploaded": "សរុបឯកសារផ្ទុកឡើង", "Total Docs not Uploaded": "សរុបឯកសារមិនបានផ្ទុកឡើង", @@ -307,10 +356,13 @@ "Try standing next to a window": "ព្យាយាមឈរជាប់បង្អួច", "Unable to check for update. Make sure you are connected to the Internet and try again.": "Unable to check for update. Make sure you are connected to the Internet and try again.", "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", "Unknown": "Unknown", "Update App": "ធ្វើបច្ចុប្បន្នភាពកម្មវិធី", "Update is Running. Please Wait ...": "ធ្វើបច្ចុប្បន្នភាពកំពុងដំណើរការ។ សូមរង់ចាំ ...", + "Updating": "Updating", "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "បន្ថែមអ្នកប្រើប្រាស់បានជោគជ័យ", "User Created Succesfully": "បង្កើតអ្នកប្រើប្រាស់បានជោគជ័យ", "User Removed from Group Successfully": "ដកអ្នកប្រើប្រាស់ពីក្រុមបានជោគជ័យ", @@ -334,6 +386,7 @@ "You have not started this form": "You have not started this form", "You may not mark an item incorrect that is beyond the last item attempted.": "អ្នកមិនអាចដាក់សញ្ញាពិន្ទុមិនត្រឹមត្រូវលើធាតុមួយហួសពីធាតុប៉ុនប៉ងចុងក្រោយបានទេ", "You may proceed.": "អ្នកអាចដំណើរការបាន", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": " APK របស់អ្នកកំពុងសាងសង់...", "Your PWA is building...": " PWA របស់អ្នកកំពុងសាងសង់...", "accept": "accept", @@ -356,6 +409,7 @@ "manifest": "manifest", "merged": "merged", "new case": "new case", + "new form": "new form", "new issue": "new issue", "next": "next", "no": "no", @@ -365,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "ចម្លើយ", + "result": "result", "review case": "review case", "review form": "review form", "revision": "revision", diff --git a/translations/translation.amh.json b/translations/translation.amh.json index 4792a45b8a..32d3b80efa 100644 --- a/translations/translation.amh.json +++ b/translations/translation.amh.json @@ -13,33 +13,46 @@ "Add New User": "አዲስ ተገልጋይ ጨምር", "Add Student": "ተማሪ ጨምር", "Add User to Group": "ተገልጋይ ወደ ማህበር ጨምር", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "ለውጥ አለ፡፡ ለውጡን ከመጫንወ በፊት ያለወት መረጃ ከነበረወት ጋር መዋሃዱን እርግጠኛ ይሁኑ፡፡ ይህን ካላደረጉ አቋርጥ የሚለውን ይጫኑ፣ ለውጡን ለመጫን ዝግጁ ከሆኑ አወ የሚለውን ይጫኑ", "Applying Updates...": "ለውጡን በመተግበር ላይ...", "April": "ሚያዚያ", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "የመጠይቅ ምላሹን ለመጀመር እንደሚፈልጉ እርግጠኛ ኖት?", "Are you sure you would like to exit the form?": "እርግጠኛ ኖት መጠይቁን ትተው ለመውጣት ይፈልጋሉ?", + "Attend.": "Attend.", + "Attendance": "Attendance", "August": "ነሃሴ", "Average": "አማካይ", "Average Correct": "ትክክለኛ በ አማካይ", "Average Correct (%)": "ትክክለኛ በ አማካይ (%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "ኬዝ", "Cases": "ኬዞች", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "ለውጥ መኖሩን አረጋግጥ", "Checking": "በማረጋገጥ ላይ...", "Checking For Updates...": "ለውጥ መኖሩን በማረጋገጥ ላይ...", "Choose a task report from one of the following selections:": "ከሚከተሉት ምርጫወች ውስጥ የስራ መግለጫ ይምረጡ:", "Choose type...": "Choose type...", "Choose which case type": "የትኛው ኬዝ አይነት እንደሆነ ይምረጡ", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "በ ክላስ መመደብ", "Class Size": "የ ክላስ መጠን", "Class grouping": "Class grouping", + "Classes": "Classes", "Click a Picture": "ምስል ይምረጡ", "Click on a percentile to view related feedback.": "የ ፐርሰንት መግለጫውን በመጫን ተያያዥ አስተያየቶችን ይመልከቱ", "Click the play button to get started.": "ለመጀመር ተጫወት የሚለውን ቁልፍ ይጫኑ.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "ለማውረድ ይጫኑ", "Close": "ዝጋ", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -62,7 +75,10 @@ "Creating new case...": "Creating new case...", "Current": "አሁን ላይ ያለ", "Curriculum": "ካሪኩለም", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "የ መረጃ ማውጫወች", + "Dashboard": "Dashboard", + "Date": "Date", "Date and Time": "ቀን እና ሰአት", "Day": "ቀን", "Day View": "Day View", @@ -80,9 +96,11 @@ "EXPORT DATA FOR ALL USERS": "መረጃ ለሁሉም ተገልጋዮች እንዲደርስ ላክ", "Edit Item": "በ ከፍሉ ላይ ለውጥ አድርግበት", "Email": "ኢሜል", + "End Date": "End Date", "Enter your response to above question here": "ከላይ ላለው ጥያቄ ", "Error Downloading File": "ፋይሉን በማውረድ ላይ ችግር አጋጥሟል", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "ክስተት", "Export Backup": "Export Backup", "Export Data": "መረጃውን አውጣ", @@ -105,6 +123,7 @@ "Generating CSV": "ሲ ኤስ ቪ በማዘጋጀት ላይ", "Geolocation authorized.": "Geolocation authorized.", "Good": "ጥሩ", + "Grade": "Grade", "Great": "በጣም ጥሩ", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "ማህበር", @@ -141,6 +160,7 @@ "Logout": "ውጣ", "Longitude": "ሎንጊቲዩድ", "MARK": "ትኩረት ስጥ", + "Maintenance": "Maintenance", "Manage Groups": "ማህበሮችን አስተዳድር", "Manage Profile": "የማንነት መረጃን አስተዳድር", "Manage Users": "ተገልጋዮችን አስተዳድር", @@ -149,6 +169,8 @@ "Mediocre": "መካከለኛ", "Meters": "ሜትሮች", "Month": "ወር", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "የኔ መጠይቆች", "Name": "ስም", "New Case": "አዲስ ኬዝ", @@ -161,7 +183,9 @@ "Next": "ቀጣይ", "No Data for": "መረጃ የሌለው ለ", "No Forms Currently Defined": "ምንም መጠይቅ አሁን ላይ አልተጠቀሰም", + "No Students currently registered.": "No Students currently registered.", "No Update": "ለውጥ የለም", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "ምንም", "Notifications authorized.": "Notifications authorized.", @@ -191,6 +215,7 @@ "Permission Denied. Login to Continue": "ፍቃድ ተከልክሏል፣ ለመቀጠል መጀመሪያ ይግቡ", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "አንድ ይምረጡ", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "እባኮትን አግባብ ያለው የ ኢሜል አድራሻ ያስገቡ", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "ደካማ", @@ -215,6 +240,8 @@ "Release APK to QA": "መተግበሪያውን ለ ጥራት ማረጋገጫ ይልቀቁት", "Release PWA to Production": "ፒ ደብሊው ኤውን ለ አገልግሎት ይልቀቁት", "Release PWA to QA": "ፒ ደብሊው ኤውን ለ ጥራት ማረጋገጫ ይልቀቁት", + "Report": "Report", + "Report for": "Report for", "Reports": "መግለጫወች", "Response": "ምላሽ", "Restore Backup": "Restore Backup", @@ -225,6 +252,7 @@ "SEARCH VIEW": "የፍለጋ እይታ", "START": "ጀምር", "STOP": "አቁም", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "ለሁሉም ተገልጋዮች መረጃውን አዋህድ", "Save": "መረጃውን አስቀምጥ", "Save before switching or your changes will be deleted.": "ከመቀየርዎ በፊት መረጃውን ያስቀምጡ ካለዛ ለውጦቹ ይጠፋሉ", @@ -232,7 +260,13 @@ "Scan Code": "ኮዱን ይቃኙ", "School": "ትምህርት ቤት", "Score": "ነጥብ", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "የማጣሪያ መታወቂያ ቁጥር", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "ቤት ይፈልጉ", "Searching": "በመፈለግ ላይ", "Searching...": "በመፈለግ ላይ...", @@ -241,6 +275,9 @@ "Select Report": "ሪፖርት ይምረጡ", "Select Student": "ተማሪ ይምረጡ", "Select Subtask": "ንዑስ ተግባር ይምረጡ", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "አንድ ወይም ከዚያ በላይ ይምረጡ", "Select only one": "አንዱን ብቻ ይምረጡ", @@ -249,22 +286,29 @@ "September": "መስከረም", "Set a password to administer your device": "Set a password to administer your device", "Settings": "ቅንብሮች", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "ጀምር", + "Start Date": "Start Date", "Start Time": "ሰአት መቁጠር ይጀምሩ", "Status": "ያለበት ሁኔታ", "Status.Concerning": "ያለበት ሁኔታ - አሳሳቢ", "Status.Good": "ያለበት ሁኔታ - ጥሩ", "Status.Great": "ያለበት ሁኔታ - በጣም ጥሩ", "Status.Poor": "ያለበት ሁኔታ - ደካማ", + "Stud.": "Stud.", "Student": "ተማሪ", "Student Dashboard": "የተማሪ ዳሽቦርድ", "Student Grouping": "የተማሪ ቡድን", + "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "የተማሪ ንዑስ ሙከራ ሪፖርት", "Students Assessed": "ምዘና የወሰዱ ተማሪዎች", "Students to watch": "መከታተል ያሉብን ተማሪዎች", "SubTask Report": "የንዑስ ተግባር ሪፖርት", + "Subject scores": "Subject scores", "Submit": "ያስገቡ", "Submitting...": "Submitting...", "Subtask": "ንዑስ ተግባር", @@ -282,7 +326,9 @@ "Tangerine": "ታንጀሪን", "Tap any boxes that were incorrect during the test.": "በሙከራው ጊዜ ትክክል ያልነበሩ ሳጥኖችን ይጫኑ", "Tap items to mark them incorrect.": "ክፍሎችን በመጫን ትክክል እንዳልሆኑ ምልክት ያርጉባቸው", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "መጨረሻ ላይ የተሞከረውን ክፍል ይጫኑ", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "የተግባር ሪፖርት", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "አሁን መተግበሪያው ለውጥ እንዳለ ካረጋገጠ በኋላ ለውጡን ለማውረድ ይሞክራል፡፡ እባክወን በዚህ ሂደት ውስጥ ከ ኢንተርኔት ጋር ያለወት ግንኙነት እንዳይቋረጥ፡፡ ለመቀጠል እሸ ሚለውን ይጫኑ፡፡", @@ -293,8 +339,11 @@ "There is unsaved data. Are you sure you would like to exit the form?": "ጥበቃ ያልተደረገለት መረጃ አለ፡፡ እርግጠኛ ኖት መጠይቁን ትተው ለመውጣት ይፈልጋሉ?", "This Field is Required": "ይህ መረጃ መቀበያ አስፈላጊ ነው", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "ጥቆማዎች", "Today": "ዛሬ", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "ድምር", "Total Docs Uploaded": "አጠቃላይ ወደ ሰርቨር የገቡ መረጃዎች", "Total Docs not Uploaded": "አጠቃላይ ወደ ሰርቨር ያልገቡ መረጃዎች", @@ -307,10 +356,13 @@ "Try standing next to a window": "ከ መስኮት ጎን ለመቆም ይሞክሩ", "Unable to check for update. Make sure you are connected to the Internet and try again.": "ለውጥ መኖሩን ማረጋገጥ አልተቻለም፡፡ ኢንተርኔት መኖሩን ያረጋግጡና እንደገና ይሞከሩ", "Unassigned Category": "ያልተመደበ ምድብ", + "Unit Report": "Unit Report", "Unknown": "ያልታወቀ", "Update App": "መተግብሪያውን በ አዲስ ለውጦች ያሻሸሉት", "Update is Running. Please Wait ...": "ለውጥ እየተካሄደ ነው፣ እባክዎን ይጠብቁ ...", + "Updating": "Updating", "Updating...": "በለውጥ ላይ...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "ተገልጋይ ወደ ማህበሩ በተሳካ ሁኔታ ተጨምሯል", "User Created Succesfully": "ተገልጋይ በተሳካ ሁኔታ ተፈጥሯል", "User Removed from Group Successfully": "ተገልጋይ በተሳካ ሁኔታ ከ ማህበር ተወግዷል", @@ -334,6 +386,7 @@ "You have not started this form": "ይህንን መጠይቅ አልጀመሩትም", "You may not mark an item incorrect that is beyond the last item attempted.": "በመጨረሻ ከተሞከረው ክፍል በኋላ ያለን ክፍል ትክክል እንዳልሆነ አደርገው ማጥቆር አይችሉም", "You may proceed.": "መቀጠል ይችላሉ", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": "መተግበሪያው በመገንባት ላይ ነው...", "Your PWA is building...": "ፒ ደብሊው ኤው በመገንባት ላይ ነው...", "accept": "ተቀበል", @@ -356,6 +409,7 @@ "manifest": "አሳይ", "merged": "ተቀላቅሏል", "new case": "አዲስ ቤት", + "new form": "new form", "new issue": "አዲስ ችግር", "next": "ቀጣይ", "no": "no", @@ -365,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "ምላሽ", + "result": "result", "review case": "ጉዳዩን ተመልከት", "review form": "መጠይቁን ተመልከት", "revision": "revision", diff --git a/translations/translation.bn.json b/translations/translation.bn.json index f981315d57..fbdae3526a 100644 --- a/translations/translation.bn.json +++ b/translations/translation.bn.json @@ -1,231 +1,441 @@ { - "Unable to check for update. Make sure you are connected to the Internet and try again.": "আপডেট চেক করতে পারছেন না , নিশ্চিত করুন যে আপনি ইন্টারনেট এ সংযুক্ত আছেন এবং আবার চেষ্টা করুন।", - "+ Add User to Group": "গ্রুপে ব্যবহারকারীর নাম যুক্ত করুন", - "+ Create a New Form": "নতুন একটি ফর্ম তৈরি করুন ", - "+ Create a New Group": "টাঙ্গেরিনে একটি নতুন গ্রুপ তৈরি করুন", - "+ Create a New User": "নতুন একজন (দলে) ব্যবহারকারীর নাম তৈরি করুন", - "Accuracy": "যথাযথতা নিশ্চিত করুন ", - "Accuracy Level": "যথাযথতার লেভেল (স্তর )", - "Add New User": "নতুন একজন ব্যবহারকারীর নাম যুক্ত করুন", - "Add User to Group": "গ্রুপে ব্যবহারকারীর নাম যুক্ত করুন", - "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "আপডেট তৈরি। আপডেটটি ইনস্টল করার আগে প্রথমে আপনার ডেটা সিঙ্ক করতে হবে। আপনি যদি এটি না করে থাকেন তবে `বাতিল এ চাপ দিন। যদি আপডেটটি ইনস্টল করতে প্রস্তুত হন তবে `হ্যাঁ তে চাপ দিন। ", - "Applying Updates...": "আপডেট টি প্রয়োগ করা হচ্ছে ", - "Are you sure you want to start a form response?": "আপনি কি ফর্মটি পূরণ করতে প্রস্তুত?", - "There is unsaved data. Are you sure you would like to exit the form?": "আপনার ডাটাটি অসংরক্ষিত। আপনি কি ফর্মটি থেকে বের হয়ার জন্য নিশ্চিতভাবে তৈরি? ", - "The form is not yet complete. Are you sure you would like to exit the form?": "ফর্মটি এখনও অসম্পূর্ণ। আপনি কি ফর্মটি থেকে বের হয়ার জন্য নিশ্চিতভাবে তৈরি? ", - "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "অ্যাপটি এখন একটি অ্যাপ্লিকেশনের আপডেট এবং ডাউনলোড করার চেষ্টা পর্যালোচনা করবে। এই প্রক্রিয়া চলাকালীন ইন্টারনেটে সংযুক্ত থাকুন। পরবর্তী ধাপে যেতে চাপুন। ", - "Case": "কেস ", - "Cases": "কেসগুলো ", - "Check for Update": "আপডেট চেক করুন। ", - "Checking For Updates...": "আপডেট চেক করা হচ্ছে… ", - "Choose which case type": "রুগীর ধরণ নির্বাচন করুন। ", - "Click a Picture": "ছবি তুলুন। ", - "Click the play button to get started.": "শুরু করার জন্য বাটন চাপুন। ", - "Click to Download": "ডাউনলোড - এ চাপুন। ", - "Close": "শেষ করুন।/ বন্ধ করুন। ", - "close": "শেষ করুন।/ বন্ধ করুন। ", - "Confirm New Password": "নতুন পাসওয়ার্ড নিশ্চিত করুন। ", - "Confirm Password": "পাসওয়ার্ড নিশ্চিত করুন। ", - "Could Not Contact Server.": "সার্ভারের সাথে সংযুক্ত করা যায়নি।", - "Could Not Create User": "ব্যবহারকারীর আইডি তৈরী করা যায়নি। ", - "Could Not Generate APK": "অ্যাপ্লিকেশন তৈরী করা যায়নি। ", - "Could Not Generate PWA": "পি ডাব্লিউ এ অ্যাপ্লিকেশনটি তৈরী করা যায়নি। ", - "Could Not Load List Of Forms": "ফর্মের তালিকা লোড করা যায়নি", - "Complete": "সম্পূর্ণ ", - "Create Form": "ফর্ম তৈরি করুন ", - "Date and Time": "দিন এবং তারিখ ", - "Distance from reference": "রেফারেন্স থেকে দূরত্ব ", - "Docs Not Uploaded": "ফলাফল আপলোড করা হয়নি ", - "Docs Uploaded": "ফলাফল আপলোড করা হয়েছে ", - "Download CSV": " CSV ফাইল ডাউনলোড করুন ", - "Download your APK": "অ্যাপ্লিকেশনটি ডাউনলোড করুন ", - "EXPORT DATA FOR ALL USERS": "সকল ব্যবহারকারীর জন্য ডাটা এক্সপোর্ট করুন ", - "Edit Item": "ডাটা সম্পাদনা করুন ", - "Email": "ইমেইল ", - "Enter your response to above question here": "উপরের প্রশ্নে আপনার প্রতিক্রিয়া এখানে লিখুন", - "Error Downloading File": "ফাইল ডাউনলোড এ ত্রুটি সনাক্ত হয়েছে ", - "Event": "কার্যক্রম / ইভেন্ট ", - "events": "কার্যক্রমগুলো/ ইভেন্টস ", - "Export Data": "ডাটা এক্সপোর্ট করুন ", - "File Stored At": "ফাইল জমা হচ্ছে…( জায়গার নাম) ", - "Filter": "ডাটা ফিল্টার করুন ", - "First Name": "নামের প্রথম অংশ ", - "Form": "ফর্ম ", - "Form Id": "ফর্মের আই ডি নাম্বার দিন ", - "Form Name": "ফর্মের নাম ", - "Form Title": "ফর্মের শিরোনাম ", - "Forms": "ফর্মগুলো ", - "Generate APK/PWA": "অ্যাপ্লিকেশন তৈরি করুন ", - "Generating CSV": "CSV - অ্যাপ্লিকেশন তৈরি করা হচ্ছে ", - "Group": "গ্রূপ তৈরি করুন ", - "Group Created Succesfully": "গ্রূপ সফলভাবে তৈরি করা হয়েছে ", - "Group Details": "দলের/ গ্রুপের বিবরণ ", - "Group Name": "দলের/ গ্রুপের নাম", - "Help": "সাহায্য ( প্রয়োজন )", - "Incomplete": "অসম্পূর্ণ ", - "Item Listing": "আইটেমের তালিকা করা হচ্ছে ", - "Item Not Found": "কোনও আইটেম পাওয়া যায়নি ", - "Item Title": "আইটেমের শিরোনাম ", - "LAST ATTEMPTED": "শেষ চেষ্টা ", - "LOGIN": "লগইন/ প্রবেশ করুন", - "Last Name": "নামের শেষ অংশ ", - "Last Successful Sync Timestamp": "সর্বশেষ সফল ডাটা সিঙ্ক করার সময় ", - "Last attempted cannot be before an item marked.": "কোনও আইটেম চিহ্নিত হওয়ার আগে শেষ চেষ্টা করা যাবে না।", - "Latitude": "জিপিএস রিডিং", - "latitude": "জিপিএস রিডিং", - "Loading": "লোডিং ডাটা ", - "loading": "লোডিং ডাটা ", - "Login": "লগিং/ প্রবেশ করুন ", - "Login Unsuccesful": "লগিং / প্রবেশ সফল হয়নি", - "Logout": "প্রস্থান করুন / বের হওন ", - "Longitude": "জিপিএস রিডিং", - "longitude": "জিপিএস রিডিং", - "MARK": "মার্ক করুন", - "Manage Groups": "গ্রুপ পরিচালনা করুন ", - "Manage Profile": "প্রোফাইল পরিচালনা করুন", - "Manage Users": "ব্যবহারকারীদের পরিচালনা করুন", - "manifest": "স্পষ্টতা ", - "Meters": "মিটার ", - "My Forms": "ট্যাব এ আমার ফর্মগুলোর লিংক ", - "new case": "নতুন কেস/ রুগী ", - "New Form": "নতুন ফর্ম ", - "New Group": "নতুন গ্রুপ ", - "New Item": "নতুন আইটেম ", - "New Password": "নতুন পাসওয়ার্ড ", - "No Data for": "ফর্মে কোন ডাটা নাই ", - "No Forms Currently Defined": "এই মুহূর্তে কোন ফর্ম পাওয়া যাচ্ছে না ", - "No Update": "কোনো আপডেট নাই ", - "Observations": "পর্যবেক্ষণ এর লিংক ", - "Open": "খোলা ", - "open": "খোলা ", - "Opened": "খোলা হয়েছে", - "Open a Case": "একটি কেস ফাইল খুলুন ", - "open cases": "কেস ফাইলগুলো খুলুন ", - "Password": "পাসওয়ার্ড ", - "Password Reset Unsuccesful": "পাসওয়ার্ড পুনরায় সেট করা সফল হয়নি ", - "Passwords do not match": "পাসওয়ার্ড মিলে নাই ", - "Percentage Complete": "পারছেন্টেজ সম্পূর্ণ ", - "Permission Denied.": "অনুমতি স্বীকৃত নয় ", - "Permission Denied. Login to Continue": "অনুমতি স্বীকৃত নয় । শুরু করতে লগিং করুন", - "Pick a": "তালিকা থেকে যেকোন একটি নির্বাচন করুন ", - "Please enter a valid email address": "একটি বৈধ ইমেইল ঠিকানা প্রবেশ করান ", - "Progress": "অগ্রগতি ", - "Projects": "প্রকল্প সমূহ ", - "RECOVER ACCOUNT": "একাউন্ট পুন: রুদ্ধার", - "REGISTER": "নিবন্ধন", - "RESET": "পুন:স্থাপন", - "RESET PASSWORD": "পাসওয়ার্ড পুনঃস্থাপন করুন।", - "Release APK to Production": " উৎপাদন করতে অ্যাপ প্রকাশ করুন ", - "Release APK to QA": "QA করতে অ্যাপ প্রকাশ করুন", - "Release PWA to Production": "উৎপাদন করতে PWA প্রকাশ করুন", - "Release PWA to QA": "QA করতে PWA কে প্রকাশ করুন ", - "Reports": "রিপোর্টের লিংক ", - "Response": "প্রতিক্রিয়া", - "response": "প্রতিক্রিয়া", - "START": "শুরু করুন ", - "STOP": "শেষ করুন ", - "SYNC DATA FOR ALL USERS": "সকল ব্যবহারকারীদের জন্য ডেটা সিঙ্ক করুন ", - "Save": "সেভ করুন ", - "save": "সেভ করুন ", - "Save before switching or your changes will be deleted.": "স্যুইচ করার আগে ডাটা সেভ/সংরক্ষণ করুন নতুবা আপনার পরিবর্তনগুলি মুছে ফেলা হবে।", - "School": "স্কুল ", - "Searching": "অনুসন্ধান করা হচ্ছে", - "searching": "অনুসন্ধান করা হচ্ছে", - "Select Form Name": "ফর্মের নাম নির্বাচন করুন", - "Select one or more": "এক বা তার বেশী নির্বাচন করুন ", - "Select only one": "শুধুমাত্র একটি নির্বাচন করুন ", - "Select your Username": "ব্যবহারকারীর নাম নির্বাচন করুন", - "Settings": "সেটিংস", - "start another": "অন্যটি শুরু করুন ", - "start event": "ইভেন্ট শুরু করুন", - "start form": "ফর্ম শুরু করুন ", - "Start Time": "শুরুর সময় ", - "Status": "অবস্থা", - "submit": "জমা দিন ", - "Summary": "সারসংক্ষেপ", - "summary": "সারসংক্ষেপ", - "Support": "সমর্থন", - "Switch Editor": "সম্পাদনাকারী পরিবর্তন করুন ", - "Sync": "সিঙ্ক করুন ", - "Sync Successful": "সিঙ্ক সফল হয়েছে ", - "Sync Unsuccessful. Please Retry": "সিঙ্কটি সফল হয়নি, আবার চেষ্টা করুন। ", - "Syncing Status By User": "ব্যবহারকারীর দ্বারা ডাটা সিঙ্ক করা হচ্ছে", - "Syncing Status Summary": "সিঙ্ক ডাটার সারসংক্ষেপ", - "Tangerine": "টাঙ্গেরিন ", - "Tap any boxes that were incorrect during the test.": " কোন বক্সে চাপুন যেটা টেস্টের সময় ভুল ছিল ", - "Tap items to mark them incorrect.": "আইটেমগুলিকে ভুল চিহ্নিত করতে চাপুন।", - "Tap the item last attempted.": "সর্বশেষে চেষ্টা করা আইটেমটি আলতো চাপুন।", - "This Field is Required": "ঘরটি অবশ্যই পূরণ করতে হবে", - "Tips": "পরামর্শ", - "Total": "সর্বমোট ", - "Total Docs Uploaded": "সম্পূর্ণ ডাটা আপলোড হয়েছে ", - "Total Docs not Uploaded": "সম্পূর্ণ ডাটা আপলোড হয়নি ", - "Total Percentage Complete": "পুরোপুরি সম্পূর্ণ ", - "Total Updates Applied": "সম্পূর্ণ আপডেট ব্যাবহার করা হয়েছে ", - "Try moving outside with a clear view of the sky": "আকাশ স্পষ্ট হলে বাহিরে যাওয়ার চেষ্টা করুন ", - "Try standing away from trees or buildings": "গাছ অথবা দালান থেকে দূরে দাঁড়ানোর চেষ্টা করুন ", - "Try standing next to a window": "জানালার পাশে দাঁড়ানোর চেষ্টা করুন ", - "Update App": "অ্যাপ আপডেট ", - "Update is Running. Please Wait ...": "ডাটা আপডেট হচ্ছে… অপেক্ষা করুন ", - "User Added to Group Successfully": "ব্যবহারকারী দলের সাথে সফল ভাবে যুক্ত হয়েছেন ", - "User Created Succesfully": "ব্যবহারকারীর আইডি সফলভাবে তৈরি করা হয়েছে", - "User Removed from Group Successfully": "ব্যবহারকারীকে দল থেকে সফল ভাবে বাদ দেয়া হয়েছে ", - "Username": "ব্যবহারকারীর নাম ", - "Username Available": "ব্যবহারকারীর নাম প্রাপ্যতা ", - "Username Unavailable": "ব্যবহারকারীর নাম অপ্রাপ্যতা ", - "View your PWA": "আপনার PWA দেখুন ", - "Visits": "ভিজিট ", - "Write Failed": "লিখা ব্যর্থ", - "You do not have access to the resource.": "আপনার রিসোর্সে প্রবেশের অনুমোদন নাই ", - "You have not started this event": "আপনি এই ইভেন্টটি শুরু করেন নি", - "You have not started this form": "আপনি এই ফর্মটি শুরু করেন নি", - "You may not mark an item incorrect that is beyond the last item attempted.": "চেষ্টা করা শেষ আইটেমের বাইরে আপনি কোনও আইটেমটিকে ভুল হিসাবে চিহ্নিত করতে পারবেন না ", - "You may proceed.": "আপনি সামনে এগিয়ে যেতে পারেন ", - "Your APK is building...": "আপনার APK/ অ্যাপ তৈরি হচ্ছে ...", - "Your PWA is building...": "আপনার PWA / অ্যাপ তৈরি হচ্ছে ...", - "here": "এখানে ", - "✓ Yay! You are up to date.": "✓ হ্যাঁ! আপনার ডাটা আপডেটেড ", - "yes, continue": "হা, চালিয়ে যান ", - "no, stop": "না, বন্ধ করুন ", - "SEARCH VIEW": "অনুসন্ধান দেখুন/ দর্শন ", - "next": "পরবর্তী ", - "back": "পিছনে ফেরত আসুন ", - "Average Correct (%)": "গড়ে সঠিক (%)", - "Average Correct": "গড়ে সঠিক", - "Students to watch": "শিক্ষার্থী ", - "Feedback": "Feedback", - "Add Student": "শিক্ষার্থী সংযোজন", - "Add Class": "শ্রেণি ও বিষয় সংযোজন", - "Select Report": "প্রতিবেদন নির্বাচন", - "Class grouping": "দলগত প্রতিবেদন", - "Student Subtest Report": "শিক্ষার্থীর একক প্রতিবেদন", - "Task Report": "কাজের প্রতিবেদন", - "Choose a task report from one of the following selections:": "নিচের যেকোনো একটি কাজের প্রতিবেদন নির্বাচন করুন", - "SubTask Report": "কাজের প্রতিবেদনঃ গণিত", - "Subtask": "কাজ", - "Average": "গড়", - "Students Assessed": "মূল্যায়িত শিক্ষার্থী", - "Grouping Report": "দলগত প্রতিবেদন", - "Name": "শিক্ষার্থী ", - "Status": "স্ট্যাটাস ", - "Student Grouping": "শিক্ষার্থীর দলগত ফলাফল", - "Student": "শিক্ষার্থী ", - "Score": "সঠিক উত্তর ", - "Percentile": "শতকরা", - "Great":"অতি উত্তম ", - "Good":" উত্তম ", - "Mediocre":"সন্তোষজনক", - "Concerning":"নিবিড় সহায়তা প্রয়োজন ", - "Poor":"সন্তোষজনক নয় ", - "result":"ফলাফল", - "Completed?":"মুল্যায়নের অবস্থা ", - "Student": "শিক্ষার্থী ", - "Student Dashboard":"শিক্ষার্থী ড্যাশবোর্ড :", - "Feedback":"ফলাবর্তন ", - "Select Subtask": "কাজ নির্বাচন করুন ", - "SUBMIT":"জমা দিন ", - "Subtest Report":"অভীক্ষা প্রতিবেদন", - "Select Student":"শিক্ষার্থী নিবার্চন করুন", - "Results":"ফলাফল ", -"Click on a percentile to view related feedback.": "সংশ্লিষ্ট ফলাবর্তন দেখার জন্য শতকরায় ক্লিক করুন " + "% Correct": "% Correct", + "+ Add User to Group": "গ্রুপে ব্যবহারকারীর নাম যুক্ত করুন", + "+ Create a New Form": "নতুন একটি ফর্ম তৈরি করুন ", + "+ Create a New Group": "টাঙ্গেরিনে একটি নতুন গ্রুপ তৈরি করুন", + "+ Create a New User": "নতুন একজন (দলে) ব্যবহারকারীর নাম তৈরি করুন", + "About": "About", + "Accuracy": "যথাযথতা নিশ্চিত করুন ", + "Accuracy Level": "যথাযথতার লেভেল (স্তর )", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "শ্রেণি ও বিষয় সংযোজন", + "Add New User": "নতুন একজন ব্যবহারকারীর নাম যুক্ত করুন", + "Add Student": "শিক্ষার্থী সংযোজন", + "Add User to Group": "গ্রুপে ব্যবহারকারীর নাম যুক্ত করুন", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "আপডেট তৈরি। আপডেটটি ইনস্টল করার আগে প্রথমে আপনার ডেটা সিঙ্ক করতে হবে। আপনি যদি এটি না করে থাকেন তবে `বাতিল এ চাপ দিন। যদি আপডেটটি ইনস্টল করতে প্রস্তুত হন তবে `হ্যাঁ তে চাপ দিন। ", + "Applying Updates...": "আপডেট টি প্রয়োগ করা হচ্ছে ", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "আপনি কি ফর্মটি পূরণ করতে প্রস্তুত?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "গড়", + "Average Correct": "গড়ে সঠিক", + "Average Correct (%)": "গড়ে সঠিক (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "কেস ", + "Cases": "কেসগুলো ", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "আপডেট চেক করুন। ", + "Checking": "Checking", + "Checking For Updates...": "আপডেট চেক করা হচ্ছে… ", + "Choose a task report from one of the following selections:": "নিচের যেকোনো একটি কাজের প্রতিবেদন নির্বাচন করুন", + "Choose type...": "Choose type...", + "Choose which case type": "রুগীর ধরণ নির্বাচন করুন। ", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "দলগত প্রতিবেদন", + "Classes": "Classes", + "Click a Picture": "ছবি তুলুন। ", + "Click on a percentile to view related feedback.": "সংশ্লিষ্ট ফলাবর্তন দেখার জন্য শতকরায় ক্লিক করুন ", + "Click the play button to get started.": "শুরু করার জন্য বাটন চাপুন। ", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "ডাউনলোড - এ চাপুন। ", + "Close": "শেষ করুন।/ বন্ধ করুন। ", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "সম্পূর্ণ ", + "Completed?": "মুল্যায়নের অবস্থা ", + "Concerning": "নিবিড় সহায়তা প্রয়োজন ", + "Confirm New Password": "নতুন পাসওয়ার্ড নিশ্চিত করুন। ", + "Confirm Password": "পাসওয়ার্ড নিশ্চিত করুন। ", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "সার্ভারের সাথে সংযুক্ত করা যায়নি।", + "Could Not Create User": "ব্যবহারকারীর আইডি তৈরী করা যায়নি। ", + "Could Not Generate APK": "অ্যাপ্লিকেশন তৈরী করা যায়নি। ", + "Could Not Generate PWA": "পি ডাব্লিউ এ অ্যাপ্লিকেশনটি তৈরী করা যায়নি। ", + "Could Not Load List Of Forms": "ফর্মের তালিকা লোড করা যায়নি", + "Create": "Create", + "Create Form": "ফর্ম তৈরি করুন ", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "দিন এবং তারিখ ", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "রেফারেন্স থেকে দূরত্ব ", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "ফলাফল আপলোড করা হয়নি ", + "Docs Uploaded": "ফলাফল আপলোড করা হয়েছে ", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": " CSV ফাইল ডাউনলোড করুন ", + "Download your APK": "অ্যাপ্লিকেশনটি ডাউনলোড করুন ", + "EXPORT DATA FOR ALL USERS": "সকল ব্যবহারকারীর জন্য ডাটা এক্সপোর্ট করুন ", + "Edit Item": "ডাটা সম্পাদনা করুন ", + "Email": "ইমেইল ", + "End Date": "End Date", + "Enter your response to above question here": "উপরের প্রশ্নে আপনার প্রতিক্রিয়া এখানে লিখুন", + "Error Downloading File": "ফাইল ডাউনলোড এ ত্রুটি সনাক্ত হয়েছে ", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "কার্যক্রম / ইভেন্ট ", + "Export Backup": "Export Backup", + "Export Data": "ডাটা এক্সপোর্ট করুন ", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "ফলাবর্তন ", + "File Stored At": "ফাইল জমা হচ্ছে…( জায়গার নাম) ", + "File restored from ": "File restored from ", + "Filter": "ডাটা ফিল্টার করুন ", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "নামের প্রথম অংশ ", + "Form": "ফর্ম ", + "Form Id": "ফর্মের আই ডি নাম্বার দিন ", + "Form Name": "ফর্মের নাম ", + "Form Title": "ফর্মের শিরোনাম ", + "Forms": "ফর্মগুলো ", + "Generate APK/PWA": "অ্যাপ্লিকেশন তৈরি করুন ", + "Generating CSV": "CSV - অ্যাপ্লিকেশন তৈরি করা হচ্ছে ", + "Geolocation authorized.": "Geolocation authorized.", + "Good": " উত্তম ", + "Grade": "Grade", + "Great": "অতি উত্তম ", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "গ্রূপ তৈরি করুন ", + "Group Created Succesfully": "গ্রূপ সফলভাবে তৈরি করা হয়েছে ", + "Group Details": "দলের/ গ্রুপের বিবরণ ", + "Group Name": "দলের/ গ্রুপের নাম", + "Grouping Report": "দলগত প্রতিবেদন", + "Help": "সাহায্য ( প্রয়োজন )", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "অসম্পূর্ণ ", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "আইটেমের তালিকা করা হচ্ছে ", + "Item Not Found": "কোনও আইটেম পাওয়া যায়নি ", + "Item Title": "আইটেমের শিরোনাম ", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "শেষ চেষ্টা ", + "LOGIN": "লগইন/ প্রবেশ করুন", + "Last Name": "নামের শেষ অংশ ", + "Last Successful Sync Timestamp": "সর্বশেষ সফল ডাটা সিঙ্ক করার সময় ", + "Last attempted cannot be before an item marked.": "কোনও আইটেম চিহ্নিত হওয়ার আগে শেষ চেষ্টা করা যাবে না।", + "Latitude": "জিপিএস রিডিং", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "লোডিং ডাটা ", + "Location": "Location", + "Login": "লগিং/ প্রবেশ করুন ", + "Login Unsuccesful": "লগিং / প্রবেশ সফল হয়নি", + "Logout": "প্রস্থান করুন / বের হওন ", + "Longitude": "জিপিএস রিডিং", + "MARK": "মার্ক করুন", + "Maintenance": "Maintenance", + "Manage Groups": "গ্রুপ পরিচালনা করুন ", + "Manage Profile": "প্রোফাইল পরিচালনা করুন", + "Manage Users": "ব্যবহারকারীদের পরিচালনা করুন", + "March": "March", + "May": "May", + "Mediocre": "সন্তোষজনক", + "Meters": "মিটার ", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "ট্যাব এ আমার ফর্মগুলোর লিংক ", + "Name": "শিক্ষার্থী ", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "নতুন ফর্ম ", + "New Group": "নতুন গ্রুপ ", + "New Item": "নতুন আইটেম ", + "New Password": "নতুন পাসওয়ার্ড ", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "ফর্মে কোন ডাটা নাই ", + "No Forms Currently Defined": "এই মুহূর্তে কোন ফর্ম পাওয়া যাচ্ছে না ", + "No Students currently registered.": "No Students currently registered.", + "No Update": "কোনো আপডেট নাই ", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "পর্যবেক্ষণ এর লিংক ", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "খোলা ", + "Open a Case": "একটি কেস ফাইল খুলুন ", + "Opened": "খোলা হয়েছে", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "পাসওয়ার্ড ", + "Password Reset Unsuccesful": "পাসওয়ার্ড পুনরায় সেট করা সফল হয়নি ", + "Password is required": "Password is required", + "Passwords do not match": "পাসওয়ার্ড মিলে নাই ", + "Percentage Complete": "পারছেন্টেজ সম্পূর্ণ ", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "শতকরা", + "Permission Denied.": "অনুমতি স্বীকৃত নয় ", + "Permission Denied. Login to Continue": "অনুমতি স্বীকৃত নয় । শুরু করতে লগিং করুন", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "তালিকা থেকে যেকোন একটি নির্বাচন করুন ", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "একটি বৈধ ইমেইল ঠিকানা প্রবেশ করান ", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "সন্তোষজনক নয় ", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "অগ্রগতি ", + "Projects": "প্রকল্প সমূহ ", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "একাউন্ট পুন: রুদ্ধার", + "REGISTER": "নিবন্ধন", + "REPORTS": "REPORTS", + "RESET": "পুন:স্থাপন", + "RESET PASSWORD": "পাসওয়ার্ড পুনঃস্থাপন করুন।", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": " উৎপাদন করতে অ্যাপ প্রকাশ করুন ", + "Release APK to QA": "QA করতে অ্যাপ প্রকাশ করুন", + "Release PWA to Production": "উৎপাদন করতে PWA প্রকাশ করুন", + "Release PWA to QA": "QA করতে PWA কে প্রকাশ করুন ", + "Report": "Report", + "Report for": "Report for", + "Reports": "রিপোর্টের লিংক ", + "Response": "প্রতিক্রিয়া", + "Restore Backup": "Restore Backup", + "Results": "ফলাফল ", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "অনুসন্ধান দেখুন/ দর্শন ", + "START": "শুরু করুন ", + "STOP": "শেষ করুন ", + "SUBMIT": "জমা দিন ", + "SYNC DATA FOR ALL USERS": "সকল ব্যবহারকারীদের জন্য ডেটা সিঙ্ক করুন ", + "Save": "সেভ করুন ", + "Save before switching or your changes will be deleted.": "স্যুইচ করার আগে ডাটা সেভ/সংরক্ষণ করুন নতুবা আপনার পরিবর্তনগুলি মুছে ফেলা হবে।", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "স্কুল ", + "Score": "সঠিক উত্তর ", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "অনুসন্ধান করা হচ্ছে", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "ফর্মের নাম নির্বাচন করুন", + "Select Report": "প্রতিবেদন নির্বাচন", + "Select Student": "শিক্ষার্থী নিবার্চন করুন", + "Select Subtask": "কাজ নির্বাচন করুন ", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "এক বা তার বেশী নির্বাচন করুন ", + "Select only one": "শুধুমাত্র একটি নির্বাচন করুন ", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "ব্যবহারকারীর নাম নির্বাচন করুন", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "সেটিংস", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "শুরুর সময় ", + "Status": "স্ট্যাটাস ", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "শিক্ষার্থী ", + "Student Dashboard": "শিক্ষার্থী ড্যাশবোর্ড :", + "Student Grouping": "শিক্ষার্থীর দলগত ফলাফল", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "শিক্ষার্থীর একক প্রতিবেদন", + "Students Assessed": "মূল্যায়িত শিক্ষার্থী", + "Students to watch": "শিক্ষার্থী ", + "SubTask Report": "কাজের প্রতিবেদনঃ গণিত", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "কাজ", + "Subtest Name": "Subtest Name", + "Subtest Report": "অভীক্ষা প্রতিবেদন", + "Success!": "Success!", + "Summary": "সারসংক্ষেপ", + "Support": "সমর্থন", + "Switch Editor": "সম্পাদনাকারী পরিবর্তন করুন ", + "Sync": "সিঙ্ক করুন ", + "Sync Successful": "সিঙ্ক সফল হয়েছে ", + "Sync Unsuccessful. Please Retry": "সিঙ্কটি সফল হয়নি, আবার চেষ্টা করুন। ", + "Syncing Status By User": "ব্যবহারকারীর দ্বারা ডাটা সিঙ্ক করা হচ্ছে", + "Syncing Status Summary": "সিঙ্ক ডাটার সারসংক্ষেপ", + "Tangerine": "টাঙ্গেরিন ", + "Tap any boxes that were incorrect during the test.": " কোন বক্সে চাপুন যেটা টেস্টের সময় ভুল ছিল ", + "Tap items to mark them incorrect.": "আইটেমগুলিকে ভুল চিহ্নিত করতে চাপুন।", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "সর্বশেষে চেষ্টা করা আইটেমটি আলতো চাপুন।", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "কাজের প্রতিবেদন", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "অ্যাপটি এখন একটি অ্যাপ্লিকেশনের আপডেট এবং ডাউনলোড করার চেষ্টা পর্যালোচনা করবে। এই প্রক্রিয়া চলাকালীন ইন্টারনেটে সংযুক্ত থাকুন। পরবর্তী ধাপে যেতে চাপুন। ", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "ফর্মটি এখনও অসম্পূর্ণ। আপনি কি ফর্মটি থেকে বের হয়ার জন্য নিশ্চিতভাবে তৈরি? ", + "There is unsaved data. Are you sure you would like to exit the form?": "আপনার ডাটাটি অসংরক্ষিত। আপনি কি ফর্মটি থেকে বের হয়ার জন্য নিশ্চিতভাবে তৈরি? ", + "This Field is Required": "ঘরটি অবশ্যই পূরণ করতে হবে", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "পরামর্শ", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "সর্বমোট ", + "Total Docs Uploaded": "সম্পূর্ণ ডাটা আপলোড হয়েছে ", + "Total Docs not Uploaded": "সম্পূর্ণ ডাটা আপলোড হয়নি ", + "Total Percentage Complete": "পুরোপুরি সম্পূর্ণ ", + "Total Updates Applied": "সম্পূর্ণ আপডেট ব্যাবহার করা হয়েছে ", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "আকাশ স্পষ্ট হলে বাহিরে যাওয়ার চেষ্টা করুন ", + "Try standing away from trees or buildings": "গাছ অথবা দালান থেকে দূরে দাঁড়ানোর চেষ্টা করুন ", + "Try standing next to a window": "জানালার পাশে দাঁড়ানোর চেষ্টা করুন ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "আপডেট চেক করতে পারছেন না , নিশ্চিত করুন যে আপনি ইন্টারনেট এ সংযুক্ত আছেন এবং আবার চেষ্টা করুন।", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "অ্যাপ আপডেট ", + "Update is Running. Please Wait ...": "ডাটা আপডেট হচ্ছে… অপেক্ষা করুন ", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "ব্যবহারকারী দলের সাথে সফল ভাবে যুক্ত হয়েছেন ", + "User Created Succesfully": "ব্যবহারকারীর আইডি সফলভাবে তৈরি করা হয়েছে", + "User Removed from Group Successfully": "ব্যবহারকারীকে দল থেকে সফল ভাবে বাদ দেয়া হয়েছে ", + "Username": "ব্যবহারকারীর নাম ", + "Username Available": "ব্যবহারকারীর নাম প্রাপ্যতা ", + "Username Unavailable": "ব্যবহারকারীর নাম অপ্রাপ্যতা ", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "আপনার PWA দেখুন ", + "Visits": "ভিজিট ", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "লিখা ব্যর্থ", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "আপনার রিসোর্সে প্রবেশের অনুমোদন নাই ", + "You have not started this event": "আপনি এই ইভেন্টটি শুরু করেন নি", + "You have not started this form": "আপনি এই ফর্মটি শুরু করেন নি", + "You may not mark an item incorrect that is beyond the last item attempted.": "চেষ্টা করা শেষ আইটেমের বাইরে আপনি কোনও আইটেমটিকে ভুল হিসাবে চিহ্নিত করতে পারবেন না ", + "You may proceed.": "আপনি সামনে এগিয়ে যেতে পারেন ", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "আপনার APK/ অ্যাপ তৈরি হচ্ছে ...", + "Your PWA is building...": "আপনার PWA / অ্যাপ তৈরি হচ্ছে ...", + "accept": "accept", + "and": "and", + "back": "পিছনে ফেরত আসুন ", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "শেষ করুন।/ বন্ধ করুন। ", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "কার্যক্রমগুলো/ ইভেন্টস ", + "here": "এখানে ", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "জিপিএস রিডিং", + "loading": "লোডিং ডাটা ", + "longitude": "জিপিএস রিডিং", + "manifest": "স্পষ্টতা ", + "merged": "merged", + "new case": "নতুন কেস/ রুগী ", + "new form": "new form", + "new issue": "new issue", + "next": "পরবর্তী ", + "no": "no", + "no, stop": "না, বন্ধ করুন ", + "open": "খোলা ", + "open cases": "কেস ফাইলগুলো খুলুন ", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "প্রতিক্রিয়া", + "result": "ফলাফল", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "সেভ করুন ", + "scan": "scan", + "searching": "অনুসন্ধান করা হচ্ছে", + "see form": "see form", + "start another": "অন্যটি শুরু করুন ", + "start event": "ইভেন্ট শুরু করুন", + "start form": "ফর্ম শুরু করুন ", + "submit": "জমা দিন ", + "summary": "সারসংক্ষেপ", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "হা, চালিয়ে যান ", + "✓ Yay! You are up to date.": "✓ হ্যাঁ! আপনার ডাটা আপডেটেড ", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." } \ No newline at end of file diff --git a/translations/translation.en.json b/translations/translation.en.json index eb0716f725..53af74dd3c 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -13,35 +13,46 @@ "Add New User": "Add New User", "Add Student": "Add Student", "Add User to Group": "Add User to Group", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`", "Applying Updates...": "Applying Updates...", "April": "April", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "Are you sure you want to start a form response?", "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", "Attendance": "Attendance", "August": "August", "Average": "Average", "Average Correct": "Average Correct", "Average Correct (%)": "Average Correct (%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Case", "Cases": "Cases", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "Check for Update", "Checking": "Checking", "Checking For Updates...": "Checking For Updates...", "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", "Choose type...": "Choose type...", "Choose which case type": "Choose which case type", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "Class Grouping", "Class Size": "Class Size", "Class grouping": "Class grouping", + "Classes": "Classes", "Click a Picture": "Click a Picture", "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", "Click the play button to get started.": "Click the play button to get started.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "Click to Download", "Close": "Close", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -65,8 +76,8 @@ "Current": "Current", "Curriculum": "Curriculum", "Custom Date Range Report": "Custom Date Range Report", - "Dashboard": "Dashboard", "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", "Date": "Date", "Date and Time": "Date and Time", "Day": "Day", @@ -85,11 +96,13 @@ "EXPORT DATA FOR ALL USERS": "EXPORT DATA FOR ALL USERS", "Edit Item": "Edit Item", "Email": "Email", - "Enter your response to above question here": "Enter your response to above question here", "End Date": "End Date", + "Enter your response to above question here": "Enter your response to above question here", "Error Downloading File": "Error Downloading File", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "Event", + "Export Backup": "Export Backup", "Export Data": "Export Data", "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", "Failed to download application configuration file": "Failed to download application configuration file", @@ -110,6 +123,7 @@ "Generating CSV": "Generating CSV", "Geolocation authorized.": "Geolocation authorized.", "Good": "Good", + "Grade": "Grade", "Great": "Great", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "Group", @@ -146,6 +160,7 @@ "Logout": "Logout", "Longitude": "Longitude", "MARK": "MARK", + "Maintenance": "Maintenance", "Manage Groups": "Manage Groups", "Manage Profile": "Manage Profile", "Manage Users": "Manage Users", @@ -153,8 +168,9 @@ "May": "May", "Mediocre": "Mediocre", "Meters": "Meters", - "Most Recent Class": "Most Recent Class", "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "My Forms", "Name": "Name", "New Case": "New Case", @@ -167,7 +183,9 @@ "Next": "Next", "No Data for": "No Data for", "No Forms Currently Defined": "No Forms Currently Defined", + "No Students currently registered.": "No Students currently registered.", "No Update": "No Update", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "None", "Notifications authorized.": "Notifications authorized.", @@ -197,6 +215,7 @@ "Permission Denied. Login to Continue": "Permission Denied. Login to Continue", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "Pick a", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "Please enter a valid email address", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "Poor", @@ -221,9 +240,9 @@ "Release APK to QA": "Release APK to QA", "Release PWA to Production": "Release PWA to Production", "Release PWA to QA": "Release PWA to QA", - "Reports": "Reports", "Report": "Report", "Report for": "Report for", + "Reports": "Reports", "Response": "Response", "Restore Backup": "Restore Backup", "Results": "Results", @@ -233,6 +252,7 @@ "SEARCH VIEW": "SEARCH VIEW", "START": "START", "STOP": "STOP", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "SYNC DATA FOR ALL USERS", "Save": "Save", "Save before switching or your changes will be deleted.": "Save before switching or your changes will be deleted.", @@ -241,20 +261,23 @@ "School": "School", "Score": "Score", "Score average": "Score average", - "Score saved": "Score saved", - "Select a unit to view report for that period": "Select a unit to view report for that period", - "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", - "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "Search cases", "Searching": "Searching", "Searching...": "Searching...", "Security question is required": "Security question is required", - "Select a unit to enter scoring": "Select a unit to enter scoring", "Select Form Name": "Select Form Name", "Select Report": "Select Report", "Select Student": "Select Student", "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "Select one or more", "Select only one": "Select only one", @@ -263,6 +286,7 @@ "September": "September", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Settings", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", @@ -274,10 +298,12 @@ "Status.Good": "Status.Good", "Status.Great": "Status.Great", "Status.Poor": "Status.Poor", + "Stud.": "Stud.", "Student": "Student", "Student Dashboard": "Student Dashboard", "Student Grouping": "Student Grouping", "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "Student Subtest Report", "Students Assessed": "Students Assessed", "Students to watch": "Students to watch", @@ -298,11 +324,11 @@ "Syncing Status By User": "Syncing Status By User", "Syncing Status Summary": "Syncing Status Summary", "Tangerine": "Tangerine", - "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", - "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Tap any boxes that were incorrect during the test.": "Tap any boxes that were incorrect during the test.", "Tap items to mark them incorrect.": "Tap items to mark them incorrect.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "Tap the item last attempted.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "Task Report", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.", @@ -314,8 +340,10 @@ "This Field is Required": "This Field is Required", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "Tips", "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "Total", "Total Docs Uploaded": "Total Docs Uploaded", "Total Docs not Uploaded": "Total Docs not Uploaded", @@ -332,7 +360,9 @@ "Unknown": "Unknown", "Update App": "Update App", "Update is Running. Please Wait ...": "Update is Running. Please Wait ...", + "Updating": "Updating", "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "User Added to Group Successfully", "User Created Succesfully": "User Created Succesfully", "User Removed from Group Successfully": "User Removed from Group Successfully", @@ -356,6 +386,7 @@ "You have not started this form": "You have not started this form", "You may not mark an item incorrect that is beyond the last item attempted.": "You may not mark an item incorrect that is beyond the last item attempted.", "You may proceed.": "You may proceed.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": "Your APK is building...", "Your PWA is building...": "Your PWA is building...", "accept": "accept", @@ -388,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "response", + "result": "result", "review case": "review case", "review form": "review form", "revision": "revision", diff --git a/translations/translation.es_gt.json b/translations/translation.es_gt.json index 5153b484b7..6259c1321a 100755 --- a/translations/translation.es_gt.json +++ b/translations/translation.es_gt.json @@ -1,289 +1,441 @@ { -"Unable to check for update. Make sure you are connected to the Internet and try again.":"No se ha podido comprobar la actualización. Asegúrese de que está conectado a Internet e inténtelo de nuevo.", -"+ Add User to Group":" + Añadir usuario al grupo", -"+ Create a New Form":" + Crear un nuevo formulario", -"+ Create a New Group":" + Crear un nuevo grupo", -"+ Create a New User":" + Crear un nuevo usuario", -"Accuracy":"Precisión", -"Accuracy Level":"Nivel de precisión", -"Add New User":"Añadir nuevo usuario", -"Add User to Group":"Añadir usuario a grupo", -"An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"Hay una actualización disponible. Asegúrese de sincronizar sus datos antes de instalar la actualización. Si no lo ha hecho, haga clic en `Cancelar`. Si está listo para instalar la actualización, haga clic en `Sí`.", -"Applying Updates...":"Aplicar actualizaciones...", -"Are you sure you want to start a form response?":"¿Está seguro de que desea iniciar una respuesta de formulario?", -"There is unsaved data. Are you sure you would like to exit the form?":"Hay datos sin guardar. ¿Está seguro de que desea salir del formulario?", -"The form is not yet complete. Are you sure you would like to exit the form?":"El formulario aún no está completo. ¿Está seguro de que desea salir del formulario?", -"The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"La aplicación buscará ahora una actualización de la aplicación e intentará descargarla. Permanezca conectado a Internet durante este proceso. Pulse OK para continuar.", -"Case":"Caso", -"Cases":"Casos", -"Check for Update":"Buscar actualizaciones", -"Checking For Updates...":"Buscar actualizaciones...", -"Choose which case type":"Elija el tipo de caso", -"Click a Picture":"Haga clic en una imagen", -"Click the play button to get started.":"Haga clic en el botón de reproducción para empezar.", -"Click to Download":"Haga clic para descargar", -"Close":"Cerrar", -"close":"cerrar", -"Confirm New Password":"Confirmar nueva contraseña", -"Confirm Password":"Confirmar contraseña", -"Could Not Contact Server.":"No se pudo contactar con el servidor.", -"Could Not Create User":"No se pudo crear el usuario", -"Could Not Generate APK":"No se pudo generar APK", -"Could Not Generate PWA":"No se puede generar PWA", -"Could Not Load List Of Forms":"No se ha podido cargar la lista de formularios", -"Complete":"Completar", -"Create Form":"Crear formulario", -"Date and Time":"Fecha y hora", -"Distance from reference":"Distancia de la referencia", -"Docs Not Uploaded":"Documentos no cargados", -"Docs Uploaded":"Documentos cargados", -"Download CSV":"Descargar CSV", -"Download your APK":"Descargar APK", -"EXPORT DATA FOR ALL USERS":"EXPORTAR DATOS PARA TODOS LOS USUARIOS", -"Edit Item":"Editar elemento", -"Email":"Correo electrónico", -"Enter your response to above question here":"Escriba aquí su respuesta a la pregunta anterior", -"Error Downloading File":"Error al descargar el archivo", -"Event":"Evento", -"events":"eventos", -"Export Data":"Exportar datos", -"File Stored At":"Archivo almacenado en", -"Filter":"Filtrar", -"First Name":"Nombre", -"Form":"Formulario", -"Form Id":"Id del formulario", -"Form Name":"Nombre del formulario", -"Form Title":"Título del formulario", -"Forms":"Formularios", -"Generate APK/PWA":"Generar APK/PWA", -"Generating CSV":"Generar CSV", -"Group":"Grupo", -"Group Created Succesfully":"Grupo creado con éxito", -"Group Details":"Detalles del grupo", -"Group Name":"Nombre del grupo", -"Help":"Ayuda", -"Incomplete":"Incompleto", -"Item Listing":"Listado de elementos", -"Item Not Found":"Artículo no encontrado", -"Item Title":"Título del artículo", -"LAST ATTEMPTED":"ÚLTIMO INTENTO", -"LOGIN":"INICIAR SESIÓN", -"Last Name":"Último nombre", -"Last Successful Sync Timestamp":"Última sincronización correcta", -"Last attempted cannot be before an item marked.":"El último intento no puede ser anterior a un elemento marcado.", -"Latitude":"Latitud", -"latitude":"latitud", -"Loading":"Cargando", -"loading":"cargando", -"Login":"Iniciar sesión", -"Login Unsuccesful":"Inicio de sesión fallido", -"Logout":"Cerrar sesión", -"Longitude":"Longitud", -"longitude":"longitud", -"MARK":"MARCAR", -"Manage Groups":"Gestionar Grupos", -"Manage Profile":"Gestionar perfil", -"Manage Users":"Gestionar usuarios", -"manifest":"manifestar", -"Meters":"Contadores", -"My Forms":"Mis formularios", -"new case":"Nuevo caso", -"New Form":"Nuevo formulario", -"New Group":"Nuevo grupo", -"New Item":"Nuevo elemento", -"New Password":"Nueva contraseña", -"No Data for":"No hay datos para", -"No Forms Currently Defined":"No hay formularios definidos actualmente", -"No Update":"Ninguna actualización", -"Observations":"Observaciones", -"Open":"Abrir", -"open":"abierto", -"Opened":"Abierto", -"Open a Case":"Abrir un caso", -"open cases":"abrir casos", -"Password":"Contraseña", -"Password Reset Unsuccesful":"Restablecimiento de contraseña fallido", -"Passwords do not match":"Las contraseñas no coinciden", -"Percentage Complete":"Porcentaje Completo", -"Permission Denied.":"Permiso denegado.", -"Permission Denied. Login to Continue":"Permiso denegado. Inicie sesión para continuar", -"Pick a":"Elija una", -"Please enter a valid email address":"Introduzca una dirección de correo electrónico válida", -"Progress":"Progreso", -"Projects":"Proyectos", -"RECOVER ACCOUNT":"RECUPERAR CUENTA", -"REGISTER":"REGISTRAR", -"RESET":"REINICIAR", -"RESET PASSWORD":"RESTABLECER CONTRASEÑA", -"Release APK to Production":"Liberar APK a Producción", -"Release APK to QA":"Liberar APK a QA", -"Release PWA to Production":"Liberar PWA a producción", -"Release PWA to QA":"Liberar PWA a QA", -"Reports":"Informes", -"Response":"Respuesta", -"response":"respuesta", -"START":"INICIO", -"STOP":"STOP", -"SYNC DATA FOR ALL USERS":"SINCRONIZAR DATOS PARA TODOS LOS USUARIOS", -"Save":"Guardar", -"save":"guardar", -"Save before switching or your changes will be deleted.":"Guarde antes de cambiar o sus cambios serán borrados.", -"School":"Escuela", -"Searching":"Buscar en", -"searching":"buscar en", -"Select Form Name":"Seleccione el nombre del formulario", -"Select one or more":"Seleccione uno o más", -"Select only one":"Seleccione sólo uno", -"Select your Username":"Seleccione su nombre de usuario", -"Settings":"Configuración", -"start another":"iniciar otro", -"start event":"iniciar evento", -"start form":"Iniciar formulario", -"Start Time":"Hora de inicio", -"Status":"Estado", -"submit":"Guardar", -"Summary":"Resumen", -"summary":"resumen", -"Support":"Soporte", -"Switch Editor":"Cambiar de editor", -"Sync":"Sincronización", -"Sync Successful":"Sincronización correcta", -"Sync Unsuccessful. Please Retry":"Sincronización fallida. Vuelva a intentarlo", -"Syncing Status By User":"Estado de sincronización por usuario", -"Syncing Status Summary":"Resumen del estado de la sincronización", -"Tangerine":"Mandarina", -"Tap any boxes that were incorrect during the test.":"Toque cualquier casilla que haya sido incorrecta durante la prueba.", -"Tap items to mark them incorrect.":"Pulse los elementos para marcarlos como incorrectos.", -"Tap the item last attempted.":"Pulse el último elemento intentado.", -"This Field is Required":"Este campo es obligatorio", -"Tips":"Consejos", -"Total":"Total", -"Total Docs Uploaded":"Total de documentos cargados", -"Total Docs not Uploaded":"Total de documentos no cargados", -"Total Percentage Complete":"Porcentaje total completado", -"Total Updates Applied":"Total de actualizaciones aplicadas", -"Try moving outside with a clear view of the sky":"Intente salir al exterior con una vista despejada del cielo", -"Try standing away from trees or buildings":"Intente situarse lejos de árboles o edificios", -"Try standing next to a window":"Intente situarse junto a una ventana", -"Update App":"Aplicación de actualización", -"Update is Running. Please Wait ...":"La actualización se está ejecutando. Por favor espere...", -"User Added to Group Successfully":"Usuario añadido correctamente al grupo", -"User Created Succesfully":"Usuario creado correctamente", -"User Removed from Group Successfully":"Usuario eliminado del grupo correctamente", -"Username":"Nombre de usuario", -"Username Available":"Nombre de usuario disponible", -"Username Unavailable":"Nombre de usuario no disponible", -"View your PWA":"Ver su PWA", -"Visits":"Visita", -"Write Failed":"Error de escritura", -"You do not have access to the resource.":"No tienes acceso al recurso.", -"You have not started this event":"No has iniciado este evento", -"You have not started this form":"No ha iniciado este formulario", -"You may not mark an item incorrect that is beyond the last item attempted.":"No puede marcar como incorrecto un ítem que está más allá del último ítem intentado.", -"You may proceed.":"Puede continuar.", -"Your APK is building...":"Su APK se está construyendo...", -"Your PWA is building...":"Su PWA se está construyendo...", -"here":"aquí", -"✓ Yay! You are up to date.":"✓ ¡Yupi! Estás actualizado.", -"yes, continue":"sí, continuar", -"no, stop":"no, parar", -"SEARCH VIEW":"BUSCAR VER", -"next":"siguiente", -"back":"atrás", -"Average Correct (%)":"Media de aciertos (%)", -"Average Correct":"Media correcta", -"Students to watch":"Estudiantes a observar", -"Feedback":"Comentarios", -"Add Student":"Añadir estudiante", -"Add Class":"Añadir grupo", -"Select Report":"Seleccionar informe", -"Class grouping":"Agrupación de clases", -"Student Subtest Report":"Informe de subprueba de estudiante", -"Task Report":"Informe de tarea", -"Choose a task report from one of the following selections":"Elija un informe de tarea de una de las siguientes selecciones", -"SubTask Report":"Informe de subtarea", -"Subtask":"Subtarea", -"Average":"Promedio", -"Students Assessed":"Estudiantes evaluados", -"Grouping Report":"Informe de agrupación", -"Name":"Nombre", -"Status":"Estado", -"Student Grouping":"Agrupación de alumnos", -"Student":"Estudiante", -"Score":"Calificación", -"Percentile":"Percentil", -"Great":"Avanzado", -"Good":"Satisfactorio", -"Mediocre":"Debe Mejorar", -"Poor":"Insatisfactorio", -"Concerning":"Insatisfactorio", -"result":"resultado", -"Completed?":"¿Terminado?", -"Student":"Estudiante", -"Student Dashboard":"Resumen de los últimos 30 días", -"Select Subtask":"Seleccionar subtarea", -"SUBMIT":"GUARDAR", -"Subtest Report":"Informe de subprueba", -"Select Student":"Seleccionar estudiante", -"Results":"Resultados", -"Class Configuration":"Configuración de clase", -"Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.":"Desactive una clase para archivarla. El interruptor será blanco cuando esté \"apagado\". Haga clic en una clase 'activada' para habilitarla. El interruptor será naranja cuando esté activado.", -"General Settings":"Configuración general", -"Class":"Clase", -"Please choose your language":"Por favor elige tu idioma", -"Use PouchDB's last sequence tracking when syncing.":"Utilice el seguimiento de la última secuencia de PouchDB al sincronizar.", -"After submitting updated settings, you will be required to log in again.":"Después de enviar la configuración actualizada, se le pedirá que inicie sesión nuevamente.", -"Settings have been updated. You will now be redirected to log in.":"La configuración ha sido actualizada. Ahora serás redirigido para iniciar sesión." -"Attendance and Behaviour":"Asistencia y Comportamiento", -"Attendance":"Asistencia", -"Behavior": "Comportamiento", -"Attendance Summary": "Resumen de asistencia", -"Most Recent Class":"Último día", -"Past 30 days":"Últimos 30 días", -"Most recent":"Más reciente", -"visits":"días", -"Enter number of attendance reports to query: ":"Ingrese el número de informes de asistencia para consultar", -"Attendance reports queried":"Informes de asistencia consultados", -"Ex. Math Week 1 test":"ej. Matemáticas: Prueba Semana 1", -"Name of Test":"Nombre de la prueba", -"Begin Scoring record for today?":"¿Comenzar el registro de calificaciones de hoy?", -"Begin Attendance and Behaviour record for today?":"¿Comenzar el registro de asistencia y comportamiento de hoy?", -"Click the wrench icon to enable an archived class.":"Haga clic en el icono de engranaje para habilitar una clase archivada.", -"This student does not have a phone number.":"Este estudiante no tiene un número de teléfono.", -"Scoring":"Calificaciones", -"Attendance List":"Registro de Asistencia", -"Student Scores":"Registro de Calificaciones", -"Scores":"Calificaciones", -"No Students currently registered.":"No hay estudiantes registrados actualmente.", -"Classes":"Grupos", -"Internal Behavior":"Interno", -"External Behavior":"Externo", -"Submit":"Guardar", -"About":"Acerca de", -"Maintenance":"Mantenimiento", -"You must take attendance before you can view the attendance dashboard.":"Debes registrar asistencia antes de poder ver este panel.", -"Begin Attendance record for today?":"¿Comenzar el registro de asistencia de hoy?", -"Grade":"Grupo", -"Scores saved successfully.":"Calificaciones guardadas con éxito.", -"Would you like to update? We recommend syncing data before you do.":"¿Le gustaría actualizar la app? Recomendamos sincronizar los datos antes de hacerlo.", -"Updating":"Actualizando", -"continue":"Continuar", -"Score must be between 0 and 100":"La puntuación debe estar entre 0 y 100.", -"You must register students before you can view the attendance dashboard.":"Debe registrar a los estudiantes antes de poder ver el panel de asistencia.", -"Begin Scoring record?":"Empezar el registro de calificaciones?", -"Enter number of attendance reports to query": "Ingresar número de días para el reporte", -"Report for ":"Resumen de ", -"Attendance is: ":"Asistencia media: ", -"behaviour is: " : "comportamiento: ", -"score average is: ":"Calificación media: ", -"Stud.":"Est.", -"Open Contacts":"Buscar", -"Attend.":"Asist.", -"Behav.":"Comp.", -"Score.":"Cal.", -"Change Class":"Cambiar Grupo", -"Report":"Informes", -"Date":"Fecha", -"Please choose your language: ":"Por favor elija su idioma:", -"Change Subject":"Escoger Materia" -} + "% Correct": "% Correct", + "+ Add User to Group": " + Añadir usuario al grupo", + "+ Create a New Form": " + Crear un nuevo formulario", + "+ Create a New Group": " + Crear un nuevo grupo", + "+ Create a New User": " + Crear un nuevo usuario", + "About": "Acerca de", + "Accuracy": "Precisión", + "Accuracy Level": "Nivel de precisión", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Añadir grupo", + "Add New User": "Añadir nuevo usuario", + "Add Student": "Añadir estudiante", + "Add User to Group": "Añadir usuario a grupo", + "After submitting updated settings, you will be required to log in again.": "Después de enviar la configuración actualizada, se le pedirá que inicie sesión nuevamente.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Hay una actualización disponible. Asegúrese de sincronizar sus datos antes de instalar la actualización. Si no lo ha hecho, haga clic en `Cancelar`. Si está listo para instalar la actualización, haga clic en `Sí`.", + "Applying Updates...": "Aplicar actualizaciones...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "¿Está seguro de que desea iniciar una respuesta de formulario?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Asist.", + "Attendance": "Asistencia", + "August": "August", + "Average": "Promedio", + "Average Correct": "Media correcta", + "Average Correct (%)": "Media de aciertos (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "¿Comenzar el registro de asistencia de hoy?", + "Behav.": "Comp.", + "Behavior": "Comportamiento", + "Camera authorized.": "Camera authorized.", + "Case": "Caso", + "Cases": "Casos", + "Change Class": "Cambiar Grupo", + "Change Subject": "Escoger Materia", + "Check for Update": "Buscar actualizaciones", + "Checking": "Checking", + "Checking For Updates...": "Buscar actualizaciones...", + "Choose a task report from one of the following selections:": "Elija un informe de tarea de una de las siguientes selecciones:", + "Choose type...": "Choose type...", + "Choose which case type": "Elija el tipo de caso", + "Class": "Clase", + "Class Configuration": "Configuración de clase", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Agrupación de clases", + "Classes": "Grupos", + "Click a Picture": "Haga clic en una imagen", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "Haga clic en el botón de reproducción para empezar.", + "Click the wrench icon to enable an archived class.": "Haga clic en el icono de engranaje para habilitar una clase archivada.", + "Click to Download": "Haga clic para descargar", + "Close": "Cerrar", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "Completar", + "Completed?": "¿Terminado?", + "Concerning": "Insatisfactorio", + "Confirm New Password": "Confirmar nueva contraseña", + "Confirm Password": "Confirmar contraseña", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "No se pudo contactar con el servidor.", + "Could Not Create User": "No se pudo crear el usuario", + "Could Not Generate APK": "No se pudo generar APK", + "Could Not Generate PWA": "No se puede generar PWA", + "Could Not Load List Of Forms": "No se ha podido cargar la lista de formularios", + "Create": "Create", + "Create Form": "Crear formulario", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Fecha", + "Date and Time": "Fecha y hora", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Distancia de la referencia", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "Documentos no cargados", + "Docs Uploaded": "Documentos cargados", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Descargar CSV", + "Download your APK": "Descargar APK", + "EXPORT DATA FOR ALL USERS": "EXPORTAR DATOS PARA TODOS LOS USUARIOS", + "Edit Item": "Editar elemento", + "Email": "Correo electrónico", + "End Date": "End Date", + "Enter your response to above question here": "Escriba aquí su respuesta a la pregunta anterior", + "Error Downloading File": "Error al descargar el archivo", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "Evento", + "Export Backup": "Export Backup", + "Export Data": "Exportar datos", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Comentarios", + "File Stored At": "Archivo almacenado en", + "File restored from ": "File restored from ", + "Filter": "Filtrar", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "Nombre", + "Form": "Formulario", + "Form Id": "Id del formulario", + "Form Name": "Nombre del formulario", + "Form Title": "Título del formulario", + "Forms": "Formularios", + "Generate APK/PWA": "Generar APK/PWA", + "Generating CSV": "Generar CSV", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Satisfactorio", + "Grade": "Grupo", + "Great": "Avanzado", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Grupo", + "Group Created Succesfully": "Grupo creado con éxito", + "Group Details": "Detalles del grupo", + "Group Name": "Nombre del grupo", + "Grouping Report": "Informe de agrupación", + "Help": "Ayuda", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "Incompleto", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "Listado de elementos", + "Item Not Found": "Artículo no encontrado", + "Item Title": "Título del artículo", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "ÚLTIMO INTENTO", + "LOGIN": "INICIAR SESIÓN", + "Last Name": "Último nombre", + "Last Successful Sync Timestamp": "Última sincronización correcta", + "Last attempted cannot be before an item marked.": "El último intento no puede ser anterior a un elemento marcado.", + "Latitude": "Latitud", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "Cargando", + "Location": "Location", + "Login": "Iniciar sesión", + "Login Unsuccesful": "Inicio de sesión fallido", + "Logout": "Cerrar sesión", + "Longitude": "Longitud", + "MARK": "MARCAR", + "Maintenance": "Mantenimiento", + "Manage Groups": "Gestionar Grupos", + "Manage Profile": "Gestionar perfil", + "Manage Users": "Gestionar usuarios", + "March": "March", + "May": "May", + "Mediocre": "Debe Mejorar", + "Meters": "Contadores", + "Month": "Month", + "Most Recent Class": "Último día", + "Most recent": "Más reciente", + "My Forms": "Mis formularios", + "Name": "Nombre", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "Nuevo formulario", + "New Group": "Nuevo grupo", + "New Item": "Nuevo elemento", + "New Password": "Nueva contraseña", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "No hay datos para", + "No Forms Currently Defined": "No hay formularios definidos actualmente", + "No Students currently registered.": "No hay estudiantes registrados actualmente.", + "No Update": "Ninguna actualización", + "No absences recorded in the past month.": "Sin asistencias.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "Observaciones", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Abrir", + "Open a Case": "Abrir un caso", + "Opened": "Abierto", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "Contraseña", + "Password Reset Unsuccesful": "Restablecimiento de contraseña fallido", + "Password is required": "Password is required", + "Passwords do not match": "Las contraseñas no coinciden", + "Percentage Complete": "Porcentaje Completo", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentil", + "Permission Denied.": "Permiso denegado.", + "Permission Denied. Login to Continue": "Permiso denegado. Inicie sesión para continuar", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "Elija una", + "Please choose your language": "Por favor elige tu idioma", + "Please enter a valid email address": "Introduzca una dirección de correo electrónico válida", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Insatisfactorio", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "Progreso", + "Projects": "Proyectos", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "RECUPERAR CUENTA", + "REGISTER": "REGISTRAR", + "REPORTS": "REPORTS", + "RESET": "REINICIAR", + "RESET PASSWORD": "RESTABLECER CONTRASEÑA", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Liberar APK a Producción", + "Release APK to QA": "Liberar APK a QA", + "Release PWA to Production": "Liberar PWA a producción", + "Release PWA to QA": "Liberar PWA a QA", + "Report": "Informes", + "Report for": "Resumen de", + "Reports": "Informes", + "Response": "Respuesta", + "Restore Backup": "Restore Backup", + "Results": "Resultados", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "BUSCAR VER", + "START": "INICIO", + "STOP": "STOP", + "SUBMIT": "GUARDAR", + "SYNC DATA FOR ALL USERS": "SINCRONIZAR DATOS PARA TODOS LOS USUARIOS", + "Save": "Guardar", + "Save before switching or your changes will be deleted.": "Guarde antes de cambiar o sus cambios serán borrados.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "Escuela", + "Score": "Calificación", + "Score average": "Score average", + "Score must be between 0 and 100": "La puntuación debe estar entre 0 y 100.", + "Score.": "Cal.", + "Scores": "Calificaciones", + "Scoring": "Calificaciones", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "Buscar en", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Seleccione el nombre del formulario", + "Select Report": "Seleccionar informe", + "Select Student": "Seleccionar estudiante", + "Select Subtask": "Seleccionar subtarea", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "Seleccione uno o más", + "Select only one": "Seleccione sólo uno", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "Seleccione su nombre de usuario", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "Configuración", + "Settings have been updated. You will now be redirected to log in.": "La configuración ha sido actualizada. Ahora serás redirigido para iniciar sesión.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "Hora de inicio", + "Status": "Estado", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Est.", + "Student": "Estudiante", + "Student Dashboard": "Resumen de los últimos 30 días", + "Student Grouping": "Agrupación de alumnos", + "Student Report": "Student Report", + "Student Scores": "Registro de Calificaciones", + "Student Subtest Report": "Informe de subprueba de estudiante", + "Students Assessed": "Estudiantes evaluados", + "Students to watch": "Estudiantes a observar", + "SubTask Report": "Informe de subtarea", + "Subject scores": "Subject scores", + "Submit": "Guardar", + "Submitting...": "Submitting...", + "Subtask": "Subtarea", + "Subtest Name": "Subtest Name", + "Subtest Report": "Informe de subprueba", + "Success!": "Success!", + "Summary": "Resumen", + "Support": "Soporte", + "Switch Editor": "Cambiar de editor", + "Sync": "Sincronización", + "Sync Successful": "Sincronización correcta", + "Sync Unsuccessful. Please Retry": "Sincronización fallida. Vuelva a intentarlo", + "Syncing Status By User": "Estado de sincronización por usuario", + "Syncing Status Summary": "Resumen del estado de la sincronización", + "Tangerine": "Mandarina", + "Tap any boxes that were incorrect during the test.": "Toque cualquier casilla que haya sido incorrecta durante la prueba.", + "Tap items to mark them incorrect.": "Pulse los elementos para marcarlos como incorrectos.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "Pulse el último elemento intentado.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Informe de tarea", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "La aplicación buscará ahora una actualización de la aplicación e intentará descargarla. Permanezca conectado a Internet durante este proceso. Pulse OK para continuar.", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "El formulario aún no está completo. ¿Está seguro de que desea salir del formulario?", + "There is unsaved data. Are you sure you would like to exit the form?": "Hay datos sin guardar. ¿Está seguro de que desea salir del formulario?", + "This Field is Required": "Este campo es obligatorio", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "Este estudiante no tiene un número de teléfono.", + "Tips": "Consejos", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Desactive una clase para archivarla. El interruptor será blanco cuando esté \"apagado\". Haga clic en una clase 'activada' para habilitarla. El interruptor será naranja cuando esté activado.", + "Total": "Total", + "Total Docs Uploaded": "Total de documentos cargados", + "Total Docs not Uploaded": "Total de documentos no cargados", + "Total Percentage Complete": "Porcentaje total completado", + "Total Updates Applied": "Total de actualizaciones aplicadas", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "Intente salir al exterior con una vista despejada del cielo", + "Try standing away from trees or buildings": "Intente situarse lejos de árboles o edificios", + "Try standing next to a window": "Intente situarse junto a una ventana", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "No se ha podido comprobar la actualización. Asegúrese de que está conectado a Internet e inténtelo de nuevo.", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "Aplicación de actualización", + "Update is Running. Please Wait ...": "La actualización se está ejecutando. Por favor espere...", + "Updating": "Actualizando", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Utilice el seguimiento de la última secuencia de PouchDB al sincronizar.", + "User Added to Group Successfully": "Usuario añadido correctamente al grupo", + "User Created Succesfully": "Usuario creado correctamente", + "User Removed from Group Successfully": "Usuario eliminado del grupo correctamente", + "Username": "Nombre de usuario", + "Username Available": "Nombre de usuario disponible", + "Username Unavailable": "Nombre de usuario no disponible", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "Ver su PWA", + "Visits": "Visita", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "¿Le gustaría actualizar la app? Recomendamos sincronizar los datos antes de hacerlo.", + "Write Failed": "Error de escritura", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "No tienes acceso al recurso.", + "You have not started this event": "No has iniciado este evento", + "You have not started this form": "No ha iniciado este formulario", + "You may not mark an item incorrect that is beyond the last item attempted.": "No puede marcar como incorrecto un ítem que está más allá del último ítem intentado.", + "You may proceed.": "Puede continuar.", + "You must register students before you can view the attendance dashboard.": "Debe registrar a los estudiantes antes de poder ver el panel de asistencia.", + "Your APK is building...": "Su APK se está construyendo...", + "Your PWA is building...": "Su PWA se está construyendo...", + "accept": "accept", + "and": "and", + "back": "atrás", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "cerrar", + "closed": "closed", + "comment": "comment", + "continue": "Continuar", + "events": "eventos", + "here": "aquí", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "latitud", + "loading": "cargando", + "longitude": "longitud", + "manifest": "manifestar", + "merged": "merged", + "new case": "Nuevo caso", + "new form": "new form", + "new issue": "new issue", + "next": "siguiente", + "no": "no", + "no, stop": "no, parar", + "open": "abierto", + "open cases": "abrir casos", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "respuesta", + "result": "resultado", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "guardar", + "scan": "scan", + "searching": "buscar en", + "see form": "see form", + "start another": "iniciar otro", + "start event": "iniciar evento", + "start form": "Iniciar formulario", + "submit": "Guardar", + "summary": "resumen", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "sí, continuar", + "✓ Yay! You are up to date.": "✓ ¡Yupi! Estás actualizado.", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." +} \ No newline at end of file diff --git a/translations/translation.faprs.json b/translations/translation.faprs.json index 590169087b..dd37208731 100644 --- a/translations/translation.faprs.json +++ b/translations/translation.faprs.json @@ -1,165 +1,441 @@ { -"Unable to check for update. Make sure you are connected to the Internet and try again.":"قادر به چک کردن آپدیت ها نیست. اطمینان حاصل نمائید که با انترنیت وصل استید و دوباره کوشش نمائید.", -"+ Create a New User":"+ یک نام کاربر ایجاد کنید", -"Accuracy":"دقت", -"Accuracy Level":"سطح دقت", -"Add New User":"کاربر جدید را اضافه کردن", -"An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"یک آپدیت موجود است. اطمینان حاصل نمائید که قبل از نصب کردن آپدیت دیتای خود را همگام سازی کنید. اگر اینرا انجام نداده اید، ‎`‎لغو‎`‎ را کلیک کنید. اگر برای نصب کردن آپدیت آماده استید، ‎`‎بلی‎`‎ را کلیک کنید.", -"Applying Updates...":"در حال تطبیق کردن آپدیت ها...", -"Are you sure you want to start a form response?":"آیا مطمئن استید میخواهید یک پاسخ فورمه را آغاز نمایید؟", -"There is unsaved data. Are you sure you would like to exit the form?":"دیتای ثبت ناشده وجود دارد. آیا مطمئن استید میخواهید از فورمه خارج شوید؟", -"The form is not yet complete. Are you sure you would like to exit the form?":"فورمه هنوز تکمیل نشده است. آیا مطمئن استید میخواهید از فورمه خارج شوید؟", -"The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"حالا اپلیکیشن یک آپدیت را چیک کرده کوشش خواهد کرد تا آنرا داونلود نماید. لطفاً در جریان این پروسه به انترنیت وصل بمانید. برای پیش رفتن OK را ضربه بزنید.", -"Case":"قضیه", -"Cases":"قضایا", -"Check for Update":"چک کردن آپدیت", -"Checking For Updates...":"در حال چک کردن آپدیت ها...", -"Choose which case type":"نوع قضیه را انتخاب کنید", -"Click a Picture":"یک تصویر را کلیک کنید", -"Click the play button to get started.":"برای شروع کردن دکمه شروع را کلیک کنید.", -"Click to Download":"برای داونلود کردن کلیک کنید", -"Close":"بستن", -"close":"بستن", -"Confirm New Password":"رمز عبور جدید را تائید کنید", -"Confirm Password":"رمز عبور را تائید کنید", -"Could Not Contact Server.":"کلاود با سرور در تماس نیست.", -"Could Not Create User":"کلاود کاربر ایجاد نکرده", -"Could Not Generate APK":"کلاود APK تولید نکرده", -"Could Not Generate PWA":"کلاود PWA تولید نکرده", -"Complete":"تکمیل کردن", -"Date and Time":"تاریخ و وقت", -"Distance from reference":"فاصله از ریفرینس", -"Docs Not Uploaded":"اسناد آپلود نشده", -"Docs Uploaded":"اسناد آپلود شد", -"EXPORT DATA FOR ALL USERS":"دیتا را برای تمام کاربران صادر کردن", -"Edit Item":"ویرایش کردن جنس", -"Email":"ایمیل", -"Enter your response to above question here":"پاسخ تانرا برای سوال فوق الذکر اینجا وارد کنید", -"Error Downloading File":"هنگام داونلود کردن فایل خطا رخ داد", -"Event":"رویداد", -"events":"رویداد ها", -"Export Data":"دیتا را صادر کنید", -"File Stored At":"فایل ذخیره شده در", -"Filter":"فیلتر", -"First Name":"اسم", -"Form":"فورم", -"Form Id":"شماره شناسایی فورم", -"Form Name":"نام فورم", -"Form Title":"عنوان فورم", -"Group Created Succesfully":"گروه به صورت موفقانه ساخته شد", -"Group Details":"تفصیلات گروه", -"Group Name":"نام گروه", -"Help":"کمک", -"Incomplete":"نا تکمیل", -"Item Listing":"لیست کردن جنس", -"Item Not Found":"جنس دریافت نشد", -"Item Title":"عنوان جنس", -"LAST ATTEMPTED":"کوشش بار آخر", -"LOGIN":"ورود", -"Last Name":"تخلص", -"Last Successful Sync Timestamp":"برچسپ زمان همگام سازی موفق برای آخرین بار", -"Last attempted cannot be before an item marked.":"آخرین کوشش نمیتواند قبل از علامت گذاری شدن یک جنس باشد.", -"Latitude":"عرض بلد", -"latitude":"عرض بلد", -"Loading":"در حال بارگیری", -"loading":"در حال بارگیری", -"Login":"ورود", -"Login Unsuccesful":"ورود ناموفق مود", -"Logout":"خارج شدن", -"Longitude":"طول بلد", -"longitude":"طول بلد", -"MARK":"نشانی", -"manifest":"اعلامیه", -"Meters":"متر ها", -"My Forms":"فورمه های من", -"new case":"قضیه جدید", -"New Password":"رمز عبور جدید", -"No Data for":"دیتا موجود نیست برای", -"No Forms Currently Defined":"فورمه ها در حال حاضر معرفی نشده", -"No Update":"آپدیت وجود ندارد", -"Observations":"مشاهدات", -"Open":"باز", -"open":"باز", -"Opened":"بازشده", -"Open a Case":"یک قضیه را باز کنید", -"open cases":"قضایا را باز کنید", -"Password":"رمز عبور", -"Password Reset Unsuccesful":"رمز عبور موفقانه از بین برده شد", -"Passwords do not match":"رمز های عبور یکسان نیستند", -"Percentage Complete":"فیصدی تکمیل شده", -"Permission Denied.":"اجازه داده نشد.", -"Permission Denied. Login to Continue":"اجازه داده نشد. برای ادامه وارد شوید", -"Pick a":"انتخاب کنید یک", -"Please enter a valid email address":"لطفاً یک ایمیل آدرس درست را درج کنید", -"Progress":"پیشرفت", -"Projects":"پروژه ها", -"RECOVER ACCOUNT":"حساب کاربر را نجات دهید", -"REGISTER":"ثبت و راجستر کردن", -"RESET":"تنظیم مجدد", -"RESET PASSWORD":"تنظیم مجدد رمز عبور", -"Reports":"گزارش ها", -"Response":"پاسخ", -"response":"پاسخ", -"START":"شروع", -"STOP":"ختم", -"SYNC DATA FOR ALL USERS":"برای تمام کاربران دیتا را هماهنگ سازی کنید", -"Save":"ذخیره کردن", -"save":"ذخیره کردن", -"Save before switching or your changes will be deleted.":"قبل از تعویض کردن ذخیره کنید یا در غیر آن تغیرات تان حذف خواهد شد.", -"School":"مکتب", -"Searching":"در حال جستجو کردن", -"searching":"در حال جستجو کردن", -"Select one or more":"یکی یا بیشتر را انتخاب کنید", -"Select only one":"تنها یکی را انتخاب کنید", -"Select your Username":"اسم کاربر تانرا انتخاب کنید", -"Settings":"تنظیمات", -"start another":"دیگر را شروع کنید", -"start event":"شروع رویداد", -"start form":"شروع فورمه", -"Start Time":"وقت شروع", -"Status":"وضعیت", -"submit":"ارائه کردن", -"Summary":"خلاصه", -"summary":"خلاصه", -"Support":"پشتیبانی", -"Sync":"هماهنگ سازی", -"Sync Successful":"هماهنگ سازی موفق بود", -"Sync Unsuccessful. Please Retry":"هماهنگ سازی ناموفق بود لطفاً دوباره کوشش کنید", -"Syncing Status By User":"وضعیت را با کاربر هماهنگ سازی می کند", -"Syncing Status Summary":"در حال هماهنگ سازی خلاصه وضعیت", -"Tangerine":"تنجرین", -"Tap any boxes that were incorrect during the test.":"یکی از جعبه ها را که در جریان آزمایش نادرست بود کلیک کنید", -"Tap items to mark them incorrect.":"اجناس را برای نشانی کردن نادرست کلیک کنید", -"Tap the item last attempted.":"جنس که بار آخر بالایش کوشش شده بود کلیک کنید", -"This Field is Required":"این خانه خالی لازمی است", -"Tips":"راهنمایی ها", -"Total":"مجموع", -"Total Docs Uploaded":"مجموع اسناد آپلود شده", -"Total Docs not Uploaded":"مجموع اسناد که آپلود نشده", -"Total Percentage Complete":"فیصدی مجموعی تکمیل شده", -"Total Updates Applied":"مجموع آپدیت های تطبیق شده", -"Try moving outside with a clear view of the sky":"کوشش کنید بیرون در فضای باز بروید که آسمان واضح دیده شود", -"Try standing away from trees or buildings":"کوشش کنید که از درخت ها و تعمیر ها دور ایستاد شوید", -"Try standing next to a window":"کوشش کنید نزدیک یک کلکین ایستاد شوید", -"Update App":"آپدیت اپلیکیشن", -"Update is Running. Please Wait ...":"آپدیت در حال اجرا شدن است. لطفاً منتظر بمانید...", -"User Added to Group Successfully":"کاربر به صورت موفقانه در گروه اضافه شد", -"User Created Succesfully":"کاربر به صورت موفقانه ایجاد گردید", -"User Removed from Group Successfully":"کاربر به صورت موفقانه از گروه حذف گردید", -"Username":"اسم کاربر", -"Username Available":"اسم کاربر موجود است", -"Username Unavailable":"اسم کاربر موجود نیست", -"Visits":"بازدید ها", -"Write Failed":"نوشتن ناکام شد", -"You do not have access to the resource.":"شما به منبع دسترسی ندارید.", -"You have not started this event":"شما این رویداد را شروع نکرده اید", -"You have not started this form":"شما این فورمه را شروع نکرده اید", -"You may not mark an item incorrect that is beyond the last item attempted.":"شما نباید یک جنس را غلط نشانی کنید که قبل از آخرین جنس کوشش شده است.", -"You may proceed.":"شما به پیش رفته میتوانید.", -"✓ Yay! You are up to date.":"‎✓‎ خوبش! شما به روز رسانی شده اید.", -"yes, continue":"بلی، ادامه دهید", -"no, stop":"نخیر، متوقف شود", -"SEARCH VIEW":"نمودار جستجو", -"next":"بعدی", -"back":"قبلی" + "% Correct": "% Correct", + "+ Add User to Group": "+ Add User to Group", + "+ Create a New Form": "+ Create a New Form", + "+ Create a New Group": "+ Create a New Group", + "+ Create a New User": "+ یک نام کاربر ایجاد کنید", + "About": "About", + "Accuracy": "دقت", + "Accuracy Level": "سطح دقت", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Add Class", + "Add New User": "کاربر جدید را اضافه کردن", + "Add Student": "Add Student", + "Add User to Group": "Add User to Group", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "یک آپدیت موجود است. اطمینان حاصل نمائید که قبل از نصب کردن آپدیت دیتای خود را همگام سازی کنید. اگر اینرا انجام نداده اید، ‎`‎لغو‎`‎ را کلیک کنید. اگر برای نصب کردن آپدیت آماده استید، ‎`‎بلی‎`‎ را کلیک کنید.", + "Applying Updates...": "در حال تطبیق کردن آپدیت ها...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "آیا مطمئن استید میخواهید یک پاسخ فورمه را آغاز نمایید؟", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Average", + "Average Correct": "Average Correct", + "Average Correct (%)": "Average Correct (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "قضیه", + "Cases": "قضایا", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "چک کردن آپدیت", + "Checking": "Checking", + "Checking For Updates...": "در حال چک کردن آپدیت ها...", + "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", + "Choose type...": "Choose type...", + "Choose which case type": "نوع قضیه را انتخاب کنید", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Class grouping", + "Classes": "Classes", + "Click a Picture": "یک تصویر را کلیک کنید", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "برای شروع کردن دکمه شروع را کلیک کنید.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "برای داونلود کردن کلیک کنید", + "Close": "بستن", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "تکمیل کردن", + "Completed?": "Completed?", + "Concerning": "Concerning", + "Confirm New Password": "رمز عبور جدید را تائید کنید", + "Confirm Password": "رمز عبور را تائید کنید", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "کلاود با سرور در تماس نیست.", + "Could Not Create User": "کلاود کاربر ایجاد نکرده", + "Could Not Generate APK": "کلاود APK تولید نکرده", + "Could Not Generate PWA": "کلاود PWA تولید نکرده", + "Could Not Load List Of Forms": "Could Not Load List Of Forms", + "Create": "Create", + "Create Form": "Create Form", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "تاریخ و وقت", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "فاصله از ریفرینس", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "اسناد آپلود نشده", + "Docs Uploaded": "اسناد آپلود شد", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Download CSV", + "Download your APK": "Download your APK", + "EXPORT DATA FOR ALL USERS": "دیتا را برای تمام کاربران صادر کردن", + "Edit Item": "ویرایش کردن جنس", + "Email": "ایمیل", + "End Date": "End Date", + "Enter your response to above question here": "پاسخ تانرا برای سوال فوق الذکر اینجا وارد کنید", + "Error Downloading File": "هنگام داونلود کردن فایل خطا رخ داد", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "رویداد", + "Export Backup": "Export Backup", + "Export Data": "دیتا را صادر کنید", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "فایل ذخیره شده در", + "File restored from ": "File restored from ", + "Filter": "فیلتر", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "اسم", + "Form": "فورم", + "Form Id": "شماره شناسایی فورم", + "Form Name": "نام فورم", + "Form Title": "عنوان فورم", + "Forms": "Forms", + "Generate APK/PWA": "Generate APK/PWA", + "Generating CSV": "Generating CSV", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Good", + "Grade": "Grade", + "Great": "Great", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Group", + "Group Created Succesfully": "گروه به صورت موفقانه ساخته شد", + "Group Details": "تفصیلات گروه", + "Group Name": "نام گروه", + "Grouping Report": "Grouping Report", + "Help": "کمک", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "نا تکمیل", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "لیست کردن جنس", + "Item Not Found": "جنس دریافت نشد", + "Item Title": "عنوان جنس", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "کوشش بار آخر", + "LOGIN": "ورود", + "Last Name": "تخلص", + "Last Successful Sync Timestamp": "برچسپ زمان همگام سازی موفق برای آخرین بار", + "Last attempted cannot be before an item marked.": "آخرین کوشش نمیتواند قبل از علامت گذاری شدن یک جنس باشد.", + "Latitude": "عرض بلد", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "در حال بارگیری", + "Location": "Location", + "Login": "ورود", + "Login Unsuccesful": "ورود ناموفق مود", + "Logout": "خارج شدن", + "Longitude": "طول بلد", + "MARK": "نشانی", + "Maintenance": "Maintenance", + "Manage Groups": "Manage Groups", + "Manage Profile": "Manage Profile", + "Manage Users": "Manage Users", + "March": "March", + "May": "May", + "Mediocre": "Mediocre", + "Meters": "متر ها", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "فورمه های من", + "Name": "Name", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "New Form", + "New Group": "New Group", + "New Item": "New Item", + "New Password": "رمز عبور جدید", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "دیتا موجود نیست برای", + "No Forms Currently Defined": "فورمه ها در حال حاضر معرفی نشده", + "No Students currently registered.": "No Students currently registered.", + "No Update": "آپدیت وجود ندارد", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "مشاهدات", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "باز", + "Open a Case": "یک قضیه را باز کنید", + "Opened": "بازشده", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "رمز عبور", + "Password Reset Unsuccesful": "رمز عبور موفقانه از بین برده شد", + "Password is required": "Password is required", + "Passwords do not match": "رمز های عبور یکسان نیستند", + "Percentage Complete": "فیصدی تکمیل شده", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentile", + "Permission Denied.": "اجازه داده نشد.", + "Permission Denied. Login to Continue": "اجازه داده نشد. برای ادامه وارد شوید", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "انتخاب کنید یک", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "لطفاً یک ایمیل آدرس درست را درج کنید", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Poor", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "پیشرفت", + "Projects": "پروژه ها", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "حساب کاربر را نجات دهید", + "REGISTER": "ثبت و راجستر کردن", + "REPORTS": "REPORTS", + "RESET": "تنظیم مجدد", + "RESET PASSWORD": "تنظیم مجدد رمز عبور", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Release APK to Production", + "Release APK to QA": "Release APK to QA", + "Release PWA to Production": "Release PWA to Production", + "Release PWA to QA": "Release PWA to QA", + "Report": "Report", + "Report for": "Report for", + "Reports": "گزارش ها", + "Response": "پاسخ", + "Restore Backup": "Restore Backup", + "Results": "Results", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "نمودار جستجو", + "START": "شروع", + "STOP": "ختم", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "برای تمام کاربران دیتا را هماهنگ سازی کنید", + "Save": "ذخیره کردن", + "Save before switching or your changes will be deleted.": "قبل از تعویض کردن ذخیره کنید یا در غیر آن تغیرات تان حذف خواهد شد.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "مکتب", + "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "در حال جستجو کردن", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Select Form Name", + "Select Report": "Select Report", + "Select Student": "Select Student", + "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "یکی یا بیشتر را انتخاب کنید", + "Select only one": "تنها یکی را انتخاب کنید", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "اسم کاربر تانرا انتخاب کنید", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "تنظیمات", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "وقت شروع", + "Status": "وضعیت", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Student", + "Student Dashboard": "Student Dashboard", + "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Student Subtest Report", + "Students Assessed": "Students Assessed", + "Students to watch": "Students to watch", + "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Subtask", + "Subtest Name": "Subtest Name", + "Subtest Report": "Subtest Report", + "Success!": "Success!", + "Summary": "خلاصه", + "Support": "پشتیبانی", + "Switch Editor": "Switch Editor", + "Sync": "هماهنگ سازی", + "Sync Successful": "هماهنگ سازی موفق بود", + "Sync Unsuccessful. Please Retry": "هماهنگ سازی ناموفق بود لطفاً دوباره کوشش کنید", + "Syncing Status By User": "وضعیت را با کاربر هماهنگ سازی می کند", + "Syncing Status Summary": "در حال هماهنگ سازی خلاصه وضعیت", + "Tangerine": "تنجرین", + "Tap any boxes that were incorrect during the test.": "یکی از جعبه ها را که در جریان آزمایش نادرست بود کلیک کنید", + "Tap items to mark them incorrect.": "اجناس را برای نشانی کردن نادرست کلیک کنید", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "جنس که بار آخر بالایش کوشش شده بود کلیک کنید", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Task Report", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "حالا اپلیکیشن یک آپدیت را چیک کرده کوشش خواهد کرد تا آنرا داونلود نماید. لطفاً در جریان این پروسه به انترنیت وصل بمانید. برای پیش رفتن OK را ضربه بزنید.", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "فورمه هنوز تکمیل نشده است. آیا مطمئن استید میخواهید از فورمه خارج شوید؟", + "There is unsaved data. Are you sure you would like to exit the form?": "دیتای ثبت ناشده وجود دارد. آیا مطمئن استید میخواهید از فورمه خارج شوید؟", + "This Field is Required": "این خانه خالی لازمی است", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "راهنمایی ها", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "مجموع", + "Total Docs Uploaded": "مجموع اسناد آپلود شده", + "Total Docs not Uploaded": "مجموع اسناد که آپلود نشده", + "Total Percentage Complete": "فیصدی مجموعی تکمیل شده", + "Total Updates Applied": "مجموع آپدیت های تطبیق شده", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "کوشش کنید بیرون در فضای باز بروید که آسمان واضح دیده شود", + "Try standing away from trees or buildings": "کوشش کنید که از درخت ها و تعمیر ها دور ایستاد شوید", + "Try standing next to a window": "کوشش کنید نزدیک یک کلکین ایستاد شوید", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "قادر به چک کردن آپدیت ها نیست. اطمینان حاصل نمائید که با انترنیت وصل استید و دوباره کوشش نمائید.", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "آپدیت اپلیکیشن", + "Update is Running. Please Wait ...": "آپدیت در حال اجرا شدن است. لطفاً منتظر بمانید...", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "کاربر به صورت موفقانه در گروه اضافه شد", + "User Created Succesfully": "کاربر به صورت موفقانه ایجاد گردید", + "User Removed from Group Successfully": "کاربر به صورت موفقانه از گروه حذف گردید", + "Username": "اسم کاربر", + "Username Available": "اسم کاربر موجود است", + "Username Unavailable": "اسم کاربر موجود نیست", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "View your PWA", + "Visits": "بازدید ها", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "نوشتن ناکام شد", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "شما به منبع دسترسی ندارید.", + "You have not started this event": "شما این رویداد را شروع نکرده اید", + "You have not started this form": "شما این فورمه را شروع نکرده اید", + "You may not mark an item incorrect that is beyond the last item attempted.": "شما نباید یک جنس را غلط نشانی کنید که قبل از آخرین جنس کوشش شده است.", + "You may proceed.": "شما به پیش رفته میتوانید.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "Your APK is building...", + "Your PWA is building...": "Your PWA is building...", + "accept": "accept", + "and": "and", + "back": "قبلی", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "بستن", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "رویداد ها", + "here": "here", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "عرض بلد", + "loading": "در حال بارگیری", + "longitude": "طول بلد", + "manifest": "اعلامیه", + "merged": "merged", + "new case": "قضیه جدید", + "new form": "new form", + "new issue": "new issue", + "next": "بعدی", + "no": "no", + "no, stop": "نخیر، متوقف شود", + "open": "باز", + "open cases": "قضایا را باز کنید", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "پاسخ", + "result": "result", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "ذخیره کردن", + "scan": "scan", + "searching": "در حال جستجو کردن", + "see form": "see form", + "start another": "دیگر را شروع کنید", + "start event": "شروع رویداد", + "start form": "شروع فورمه", + "submit": "ارائه کردن", + "summary": "خلاصه", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "بلی، ادامه دهید", + "✓ Yay! You are up to date.": "‎✓‎ خوبش! شما به روز رسانی شده اید.", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." } \ No newline at end of file diff --git a/translations/translation.fr.json b/translations/translation.fr.json index 2a68cd650c..a68e321612 100644 --- a/translations/translation.fr.json +++ b/translations/translation.fr.json @@ -13,33 +13,46 @@ "Add New User": "Ajouter un nouvel utilisateur", "Add Student": "Ajouter un etudiant", "Add User to Group": "Ajouter un utilisateur à un groupe", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Une mise à jour est disponible. Assurez-vous d’abord de synchroniser vos données avant d’installer la mise à jour. Si vous ne l'avez pas encore fait, cliquez sur `Annuler`. Si vous êtes prêt à installer la mise à jour, cliquez sur `Oui`.", "Applying Updates...": "Appliquer des mises à jour ...", "April": "Avril", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "Etes-vous sure de commencer un formulaire reponse?", "Are you sure you would like to exit the form?": "Etes-vous sur de quitter?", + "Attend.": "Attend.", + "Attendance": "Attendance", "August": "Août", "Average": "Moyenne", "Average Correct": "Moyenne(Pourcentage) correcte", "Average Correct (%)": "Moyenne(Pourcentage) correcte(%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Cas", "Cases": "Des cas", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "Vérifier la mise à jour", "Checking": "Entrain de verifier", "Checking For Updates...": "Vérification des mises à jour ...", "Choose a task report from one of the following selections:": "Choississez un formualire de rapport de tâches d'une des selections suivantes", "Choose type...": "Choose type...", "Choose which case type": "Choisissez quel type de cas", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "Groupage des classes", "Class Size": "Taille des classes", "Class grouping": "Groupage des classes", + "Classes": "Classes", "Click a Picture": "Cliquez sur une image", "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", "Click the play button to get started.": "Cliquez sur le bouton de lecture pour commencer.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "Cliquez pour télécharger", "Close": "Fermer", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -62,7 +75,10 @@ "Creating new case...": "Creating new case...", "Current": "Courant", "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "REQUETE DES DONNEES", + "Dashboard": "Dashboard", + "Date": "Date", "Date and Time": "Date et l'heure", "Day": "Journeé", "Day View": "Day View", @@ -80,9 +96,11 @@ "EXPORT DATA FOR ALL USERS": "DONNÉES D'EXPORTATION POUR TOUS LES UTILISATEURS", "Edit Item": "Editer element", "Email": "E-mail", + "End Date": "End Date", "Enter your response to above question here": "Entrez votre reponse a la question ci-dessus", "Error Downloading File": "Erreur lors du téléchargement du fichier", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "un événement", "Export Backup": "Export Backup", "Export Data": "Exporter des données", @@ -105,6 +123,7 @@ "Generating CSV": "Générer du CSV", "Geolocation authorized.": "Geolocation authorized.", "Good": "Good", + "Grade": "Grade", "Great": "Great", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "Groupe", @@ -141,6 +160,7 @@ "Logout": "Se deconnecter", "Longitude": "Longitude", "MARK": "MARQUE", + "Maintenance": "Maintenance", "Manage Groups": "Gérer les groupes", "Manage Profile": "Gérer le profil", "Manage Users": "gérer les utilisateurs", @@ -149,6 +169,8 @@ "Mediocre": "Mediocre", "Meters": "Mètres", "Month": "Mois", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "Mes formulaires", "Name": "Nom", "New Case": "Nouveau cas", @@ -161,7 +183,9 @@ "Next": "Prochain", "No Data for": "Aucune donnée pour", "No Forms Currently Defined": "Aucun formulaire actuellement défini", + "No Students currently registered.": "No Students currently registered.", "No Update": "Pas de mise à jour", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "None", "Notifications authorized.": "Notifications authorized.", @@ -191,6 +215,7 @@ "Permission Denied. Login to Continue": "Permission refusée. Connectez-vous pour continuer", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "Choisissez un", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "S'il vous plaît, mettez une adresse email correcte", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "Poor", @@ -215,6 +240,8 @@ "Release APK to QA": "Libérer APK à QA", "Release PWA to Production": "Libérer PWA a la production", "Release PWA to QA": "Publier les taux de PVA à l'AQ", + "Report": "Report", + "Report for": "Report for", "Reports": "Rapports", "Response": "Réponse", "Restore Backup": "Restore Backup", @@ -225,6 +252,7 @@ "SEARCH VIEW": "VUE DE RECHERCHE", "START": "COMMENCEZ", "STOP": "ARRÊTEZ", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "Synchronisation des données pour tous les utilisateurs", "Save": "sauvegarder", "Save before switching or your changes will be deleted.": "Sauvegardez avant de vous deconnecter ou vos modifications seront supprimées", @@ -232,7 +260,13 @@ "Scan Code": "Scannez le code", "School": "École", "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "ID de dépistage", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "Recherche de cas", "Searching": "Recherche", "Searching...": "Recherche en cour,,,,", @@ -241,6 +275,9 @@ "Select Report": "Selectionnez le rapport", "Select Student": "Select Student", "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "Sélectionnez un ou plusieurs", "Select only one": "Sélectionnez un seul", @@ -249,22 +286,29 @@ "September": "Septembre", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Réglages", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Commencez", + "Start Date": "Start Date", "Start Time": "Heure de début", "Status": "Statut", "Status.Concerning": "Concernant Statut", "Status.Good": "Status,Bien", "Status.Great": "Statut,Grand", "Status.Poor": "Statut,Pauvre", + "Stud.": "Stud.", "Student": "Etudiant", "Student Dashboard": "Tableau de Bord de l'etudiant", "Student Grouping": "Regroupement d'etudiant", + "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "Rapport de tests des etudiants", "Students Assessed": "Evaluation des etudiants", "Students to watch": "Etudiants a regarder(a visiter)", "SubTask Report": "Rapports des Tâches(sous-taches)", + "Subject scores": "Subject scores", "Submit": "Soumettre", "Submitting...": "Submitting...", "Subtask": "Sous-Tâches", @@ -282,7 +326,9 @@ "Tangerine": "Tangerine", "Tap any boxes that were incorrect during the test.": "Appuyez sur les cases incorrectes lors du test.", "Tap items to mark them incorrect.": "Marquez les elements incorrects", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "Appuyez sur le dernier article essayé.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "Rapport des Tâches", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "L'application va maintenant rechercher une mise à jour de l'application et tenter de télécharger. Veuillez rester connecté à Internet pendant ce processus. Appuyez sur OK pour continuer.L'application fera une mise a jour pendant ", @@ -293,8 +339,11 @@ "There is unsaved data. Are you sure you would like to exit the form?": "Il y a des données non sauvegardées. Êtes-vous sûr de vouloir quitter le formulaire?", "This Field is Required": "Ce champ est requis", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "Conseils", "Today": "Aujourd'hui", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "Total", "Total Docs Uploaded": "Nombre total de documents téléchargés", "Total Docs not Uploaded": "Nombre total de documents non téléchargés", @@ -307,10 +356,13 @@ "Try standing next to a window": "Essayez de vous tenir à côté d'une fenêtre", "Unable to check for update. Make sure you are connected to the Internet and try again.": "Impossible de vérifier la mise à jour. Assurez-vous d'être connecté à Internet et réessayez.", "Unassigned Category": "Categorie non attribuée", + "Unit Report": "Unit Report", "Unknown": "Inconnu", "Update App": "Mise à jour de l'application", "Update is Running. Please Wait ...": "La mise à jour est en cours d'exécution. S'il vous plaît, attendez ...", + "Updating": "Updating", "Updating...": "Mise a jour en cour,,,", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "Utilisateur ajouté au groupe avec succès", "User Created Succesfully": "Utilisateur créé avec succès", "User Removed from Group Successfully": "Utilisateur supprimé du groupe avec succès", @@ -334,6 +386,7 @@ "You have not started this form": "Vous n'avez pas commencé ce formulaire", "You may not mark an item incorrect that is beyond the last item attempted.": "Vous ne pouvez pas marquer un élément incorrect qui appartient au dernier élement/détail essayé ", "You may proceed.": "Vous pouvez continuer.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": "Votre APK se construit ...", "Your PWA is building...": "Votre PWA construit ...", "accept": "acceptez", @@ -356,6 +409,7 @@ "manifest": "Manifeste", "merged": "Fusionner", "new case": "nouveau cas", + "new form": "new form", "new issue": "Nouveau problême", "next": "prochain", "no": "no", @@ -365,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "réponse", + "result": "result", "review case": "Revoir les cas", "review form": "Revoir les Formulaires", "revision": "revision", diff --git a/translations/translation.hi.json b/translations/translation.hi.json index cfb0d660e5..4008a1d671 100644 --- a/translations/translation.hi.json +++ b/translations/translation.hi.json @@ -1,196 +1,441 @@ { - - "Unable to check for update. Make sure you are connected to the Internet and try again.":"अपडेट नहीं हो पाया, सुनिश्चित करें कि आप इन्टरनेट से कनेक्ट हैं और पुनः प्रयास करें ", - "+ Add User to Group":"यूजर को ग्रुप में जोड़ें ", - "+ Create a New Form":"नया फॉर्म बनाएं ", - "+ Create a New Group":"Tangerine में एक नया ग्रुप बनायें ", - "+ Create a New User":"एक नया यूजर बनायें", - "Accuracy":"Accuracy", - "Accuracy Level":"Accuracy Level", - "Add New User":"नए यूजर को जोड़ें", - "Add User to Group":"यूजर को ग्रुप में जोड़ें |", - "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"अपडेट उपलब्ध है, अपडेट इंस्टाल करने से पहले डेटा को सिंक करें | यदि आपने ऐसा नहीं किया है तो Cancel पर क्लिक करें ,यदि आप अपडेट करने के लिए तैयार हैं तो 'Yes' पर क्लिक करें |", - "Applying Updates...":"अपडेट हो रहा है...", - "Are you sure you want to start a form response?":"क्या आप वाकई नया फॉर्म शुरू करना चाहते हैं ?", - "There is unsaved data. Are you sure you would like to exit the form?":"डेटा अभी सेव नहीं हुआ है क्या आप वास्तव में फॉर्म बंद करना चाहते हैं ?", - "The form is not yet complete. Are you sure you would like to exit the form?":"फॉर्म अभी पूरा नहीं हुआ है क्या आप वास्तव में फॉर्म बंद करना चाहते हैं ?", - "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"App अब एप्लीकेशन अपडेट करने के लिए जाँच करेगा और डाउनलोड करने का प्रयास करेगा | कृपया इस प्रक्रिया के दौरान इन्टरनेट से जुड़ें रहे | आगे बढ़ने के लिए OK पर क्लिक करें ", - "Case":"Case", - "Cases":"Cases", - "Check for Update":"अपडेट के लिए चेक करें", - "Checking For Updates...":"अपडेट के लिए चेक हो रहा है ", - "Choose which case type":"केस का प्रकार चुने", - "Click a Picture":"Click a Picture", - "Click the play button to get started.":"शुरू करने के लिए प्ले बटन पर क्लिक करें ", - "Click to Download":"Click to Download", - "Close":"Close", - "close":"close", - "Confirm New Password":"नए पासवर्ड की पुष्टि करें", - "Confirm Password":"पासवर्ड की पुष्टि करें ", - "Could Not Contact Server.":"सर्वर से संपर्क नहीं हो सका ", - "Could Not Create User":"यूजर नहीं बन सका ", - "Could Not Generate APK":"APK जनरेट नहीं हो सका", - "Could Not Generate PWA":"PWA जनरेट नहीं हो सका", - "Could Not Load List Of Forms":"फॉर्म की लिस्ट लोड नहीं हो सकी", - "Complete":"Complete", - "Create Form":"Create Form", - "Date and Time":"दिनांक और समय ", - "Distance from reference":"Distance from reference", - "Docs Not Uploaded":"डॉक्यूमेंट अपलोड नहीं किया गया", - "Docs Uploaded":"डॉक्यूमेंट अपलोड किया गया", - "Download CSV":"CSV फाइल डाउनलोड करें |", - "Download your APK":"अपनी APK फाइल अपलोड करें |", - "EXPORT DATA FOR ALL USERS":"सभी यूजर के लिए डेटा भेजें |", - "Edit Item":"Edit Item", - "Email":"Email", - "Enter your response to above question here":"ऊपर दिए गए प्रश्न के लिए अपनी प्रतिक्रिया यहाँ दर्ज करें |", - "Error Downloading File":"फाइल डाउनलोड करने में गलती (एरर)", - "Event":"Event", - "events":"events", - "Export Data":"Export Data", - "File Stored At":"File Stored At", - "Filter":"Filter", - "First Name":"पहला नाम ", - "Form":"फॉर्म ", - "Form Id":"फॉर्म आई डी ", - "Form Name":"फॉर्म का नाम ", - "Form Title":"फॉर्म का शीर्षक", - "Forms":"Forms", - "Generate APK/PWA":"APK/PWA बनाएं", - "Generating CSV":"CSV बनाएं ", - "Group":"Group", - "Group Created Succesfully":"ग्रुप सफलतापूर्वक बनाया गया |", - "Group Details":"ग्रुप का विवरण ", - "Group Name":"ग्रुप का नाम ", - "Help":"Help", - "Incomplete":"अधूरा/इन्कम्प्लीट", - "Item Listing":"आइटम की सूची ", - "Item Not Found":"आइटम नहीं मिला ", - "Item Title":"आइटम का शीर्षक ", - "LAST ATTEMPTED":"पिछली बार कब प्रयास किया गया ", - "LOGIN":"लॉग इन ", - "Last Name":"अंतिम नाम ", - "Last Successful Sync Timestamp":"पिछली बार सफलतापूर्वक सिंक करने की दिनांक और समय |", - "Last attempted cannot be before an item marked.":"किसी आइटम को चिन्हित करने से पहले अंतिम प्रयास नहीं किया जा सकता ", - "Latitude":"lattitude", - "latitude":"lattitude", - "Loading":"लोड हो रहा है", - "loading":"लोड हो रहा है", - "Login":"लॉग इन ", - "Login Unsuccesful":"लॉग इन नहीं हो पाया ", - "Logout":"लॉग आउट ", - "Longitude":"Longitude", - "longitude":"Longitude", - "MARK":"मार्क करें", - "Manage Groups":"Manage Groups", - "Manage Profile":"Manage Profile", - "Manage Users":"यूजर को संचालित करें ", - "manifest":"manifest", - "Meters":"मीटर्स", - "My Forms":"मेरे फॉर्म", - "new case":"नया केस ", - "New Form":"नया फॉर्म ", - "New Group":"नया ग्रुप ", - "New Item":"नया आइटम ", - "New Password":"नया पासवर्ड ", - "No Data for":"कोई डेटा नहीं ", - "No Forms Currently Defined":"वर्तमान में कोई डेटा निर्धारित नहीं है ", - "No Update":"कोई अपडेट नहीं ", - "Observations":"अवलोकन ", - "Open":"Open", - "open":"open", - "Opened":"Opened", - "Open a Case":"Open a Case", - "open cases":"open cases", - "Password":"पासवर्ड ", - "Password Reset Unsuccesful":"पासवर्ड रिसेट असफल ", - "Passwords do not match":"पासवर्ड मैच नहीं हुआ", - "Percentage Complete":"प्रतिशत पूर्ण ", - "Permission Denied.":"अनुमति नहीं मिली ", - "Permission Denied. Login to Continue":"अनुमति नहीं मिली जारी रखने के लिए लॉग इन करें |", - "Pick a":"एक चुनें", - "Please enter a valid email address":"कृपया वैलिड ई-मेल आई. डी. डालें ", - "Progress":"प्रोग्रेस", - "Projects":"प्रोजेक्ट्स ", - "RECOVER ACCOUNT":"रिकवर अकाउंट", - "REGISTER":"पंजीकरण ", - "RESET":"रिसेट ", - "RESET PASSWORD":"पासवर्ड रीसेट करें", - "Release APK to Production":"निर्माण के लिए APK को जारी करें ", - "Release APK to QA":"QA को APK ज़ारी करें ", - "Release PWA to Production":"निर्माण के लिए PWA को जारी करें ", - "Release PWA to QA":"QA को PWA ज़ारी करें |", - "Reports":"रिपोर्ट्स ", - "Response":"प्रतिक्रिया ", - "response":"प्रतिक्रिया ", - "START":"START", - "STOP":"STOP", - "SYNC DATA FOR ALL USERS":"सभी यूजर के लिए डाटा सिंक करें ", - "Save":"सेव करें ", - "save":"सेव करें ", - "Save before switching or your changes will be deleted.":"स्विच करने से पहले सेव करें अन्यथा आपके द्वारा किये गए परिवर्तन हट जायेंगे ", - "School":"School", - "Searching":"Searching", - "searching":"searching", - "Select Form Name":"फॉर्म का नाम चुनें", - "Select one or more":"एक या एक से अधिक का चयन करें ", - "Select only one":"केवल एक चुने ", - "Select your Username":"अपना यूजरनेम चुनें ", - "Settings":"सेटिंग्स ", - "start another":"दूसरा शुरू करें ", - "start event":"इवेंट शुरू करें ", - "start form":"फॉर्म शुरू करें ", - "Start Time":"शुरू करने का समय ", - "Status":"स्टेटस", - "submit":"submit", - "Summary":"Summary", - "summary":"summary", - "Support":"सहयोग ", - "Switch Editor":"स्विच एडिटर ", - "Sync":"Sync", - "Sync Successful":"सफलतापूर्वक सिंक ", - "Sync Unsuccessful. Please Retry":"सिंक असफल रहा कृपया दुबारा सिंक करें ", - "Syncing Status By User":"यूजर द्वारा सिंक करने का स्टेटस ", - "Syncing Status Summary":"Syncing Status Summary", - "Tangerine":"Tangerine", - "Tap any boxes that were incorrect during the test.":"किसी भी बॉक्स को टैप करे जो परीक्षण के समय गलत थे", - "Tap items to mark them incorrect.":"गलत चिन्हित करने के लिए आइटम पर टैप करें ", - "Tap the item last attempted.":"अंतिम प्रयास किये गए आइटम को टैप करें", - "This Field is Required":"यह फील्ड आवश्यक है ", - "Tips":"संकेत ", - "Total":"सम्पूर्ण ", - "Total Docs Uploaded":"अपलोड किये गए कुल डॉक्यूमेंट ", - "Total Docs not Uploaded":"कुल डॉक्यूमेंट जो अपलोड नहीं किये गए ", - "Total Percentage Complete":"कुल पूर्ण प्रतिशत ", - "Total Updates Applied":"लागू किये गए कुल अपडेट ", - "Try moving outside with a clear view of the sky":"बाहर खुले आसमान में जाकर प्रयास करें ", - "Try standing away from trees or buildings":"वृक्षों और इमारतों से दूर खड़े होकर प्रयास करें ", - "Try standing next to a window":"खिड़की के पास खड़े होकर प्रयास करें ", - "Update App":"App को अपडेट करें", - "Update is Running. Please Wait ...":"अपडेट हो रहा है कृपया प्रतीक्षा करें", - "User Added to Group Successfully":"यूजर को ग्रुप में सफलतापूर्वक जोड़ा गया ", - "User Created Succesfully":"यूजर सफलतापूर्वक बनाया गया ", - "User Removed from Group Successfully":"यूजर को सफलतापूर्वक समूह से हटाया गया", - "Username":"Username", - "Username Available":"Username उपलब्ध है ", - "Username Unavailable":"Username उपलब्ध नहीं है ", - "View your PWA":"अपना PWA देखें ", - "Visits":"विजिट्स", - "Write Failed":"लिखना असफल ", - "You do not have access to the resource.":"resource का access नहीं है", - "You have not started this event":"आपने यह इवेंट शुरू नहीं किया है ", - "You have not started this form":"आपने यह फॉर्म शुरू नहीं किया है", - "You may not mark an item incorrect that is beyond the last item attempted.":"आप किसी आइटम को गलत चिन्हित नहीं कर सकते हैं जो किये गए अंतिम प्रयास से बाहर हो", - "You may proceed.":"आप आगे बढ़ सकते हैं ", - "Your APK is building...":"आपका APK बन रहा है ", - "Your PWA is building...":"आपका PWA बन रहा है |", - "here":"यहाँ ", - "✓ Yay! You are up to date.":"✓ Yay! आपका app अपडेट है", - "yes, continue":"हाँ, ज़ारी रखें ", - "no, stop":"नहीं, रुकें", - "SEARCH VIEW":"व्यू (VIEW) खोजें", - "next":"next", - "back":"back" - - -} + "% Correct": "% Correct", + "+ Add User to Group": "यूजर को ग्रुप में जोड़ें ", + "+ Create a New Form": "नया फॉर्म बनाएं ", + "+ Create a New Group": "Tangerine में एक नया ग्रुप बनायें ", + "+ Create a New User": "एक नया यूजर बनायें", + "About": "About", + "Accuracy": "Accuracy", + "Accuracy Level": "Accuracy Level", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Add Class", + "Add New User": "नए यूजर को जोड़ें", + "Add Student": "Add Student", + "Add User to Group": "यूजर को ग्रुप में जोड़ें |", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "अपडेट उपलब्ध है, अपडेट इंस्टाल करने से पहले डेटा को सिंक करें | यदि आपने ऐसा नहीं किया है तो Cancel पर क्लिक करें ,यदि आप अपडेट करने के लिए तैयार हैं तो 'Yes' पर क्लिक करें |", + "Applying Updates...": "अपडेट हो रहा है...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "क्या आप वाकई नया फॉर्म शुरू करना चाहते हैं ?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Average", + "Average Correct": "Average Correct", + "Average Correct (%)": "Average Correct (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "Case", + "Cases": "Cases", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "अपडेट के लिए चेक करें", + "Checking": "Checking", + "Checking For Updates...": "अपडेट के लिए चेक हो रहा है ", + "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", + "Choose type...": "Choose type...", + "Choose which case type": "केस का प्रकार चुने", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Class grouping", + "Classes": "Classes", + "Click a Picture": "Click a Picture", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "शुरू करने के लिए प्ले बटन पर क्लिक करें ", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "Click to Download", + "Close": "Close", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "Complete", + "Completed?": "Completed?", + "Concerning": "Concerning", + "Confirm New Password": "नए पासवर्ड की पुष्टि करें", + "Confirm Password": "पासवर्ड की पुष्टि करें ", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "सर्वर से संपर्क नहीं हो सका ", + "Could Not Create User": "यूजर नहीं बन सका ", + "Could Not Generate APK": "APK जनरेट नहीं हो सका", + "Could Not Generate PWA": "PWA जनरेट नहीं हो सका", + "Could Not Load List Of Forms": "फॉर्म की लिस्ट लोड नहीं हो सकी", + "Create": "Create", + "Create Form": "Create Form", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "दिनांक और समय ", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Distance from reference", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "डॉक्यूमेंट अपलोड नहीं किया गया", + "Docs Uploaded": "डॉक्यूमेंट अपलोड किया गया", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "CSV फाइल डाउनलोड करें |", + "Download your APK": "अपनी APK फाइल अपलोड करें |", + "EXPORT DATA FOR ALL USERS": "सभी यूजर के लिए डेटा भेजें |", + "Edit Item": "Edit Item", + "Email": "Email", + "End Date": "End Date", + "Enter your response to above question here": "ऊपर दिए गए प्रश्न के लिए अपनी प्रतिक्रिया यहाँ दर्ज करें |", + "Error Downloading File": "फाइल डाउनलोड करने में गलती (एरर)", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "Event", + "Export Backup": "Export Backup", + "Export Data": "Export Data", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "File Stored At", + "File restored from ": "File restored from ", + "Filter": "Filter", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "पहला नाम ", + "Form": "फॉर्म ", + "Form Id": "फॉर्म आई डी ", + "Form Name": "फॉर्म का नाम ", + "Form Title": "फॉर्म का शीर्षक", + "Forms": "Forms", + "Generate APK/PWA": "APK/PWA बनाएं", + "Generating CSV": "CSV बनाएं ", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Good", + "Grade": "Grade", + "Great": "Great", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Group", + "Group Created Succesfully": "ग्रुप सफलतापूर्वक बनाया गया |", + "Group Details": "ग्रुप का विवरण ", + "Group Name": "ग्रुप का नाम ", + "Grouping Report": "Grouping Report", + "Help": "Help", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "अधूरा/इन्कम्प्लीट", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "आइटम की सूची ", + "Item Not Found": "आइटम नहीं मिला ", + "Item Title": "आइटम का शीर्षक ", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "पिछली बार कब प्रयास किया गया ", + "LOGIN": "लॉग इन ", + "Last Name": "अंतिम नाम ", + "Last Successful Sync Timestamp": "पिछली बार सफलतापूर्वक सिंक करने की दिनांक और समय |", + "Last attempted cannot be before an item marked.": "किसी आइटम को चिन्हित करने से पहले अंतिम प्रयास नहीं किया जा सकता ", + "Latitude": "lattitude", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "लोड हो रहा है", + "Location": "Location", + "Login": "लॉग इन ", + "Login Unsuccesful": "लॉग इन नहीं हो पाया ", + "Logout": "लॉग आउट ", + "Longitude": "Longitude", + "MARK": "मार्क करें", + "Maintenance": "Maintenance", + "Manage Groups": "Manage Groups", + "Manage Profile": "Manage Profile", + "Manage Users": "यूजर को संचालित करें ", + "March": "March", + "May": "May", + "Mediocre": "Mediocre", + "Meters": "मीटर्स", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "मेरे फॉर्म", + "Name": "Name", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "नया फॉर्म ", + "New Group": "नया ग्रुप ", + "New Item": "नया आइटम ", + "New Password": "नया पासवर्ड ", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "कोई डेटा नहीं ", + "No Forms Currently Defined": "वर्तमान में कोई डेटा निर्धारित नहीं है ", + "No Students currently registered.": "No Students currently registered.", + "No Update": "कोई अपडेट नहीं ", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "अवलोकन ", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Open", + "Open a Case": "Open a Case", + "Opened": "Opened", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "पासवर्ड ", + "Password Reset Unsuccesful": "पासवर्ड रिसेट असफल ", + "Password is required": "Password is required", + "Passwords do not match": "पासवर्ड मैच नहीं हुआ", + "Percentage Complete": "प्रतिशत पूर्ण ", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentile", + "Permission Denied.": "अनुमति नहीं मिली ", + "Permission Denied. Login to Continue": "अनुमति नहीं मिली जारी रखने के लिए लॉग इन करें |", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "एक चुनें", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "कृपया वैलिड ई-मेल आई. डी. डालें ", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Poor", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "प्रोग्रेस", + "Projects": "प्रोजेक्ट्स ", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "रिकवर अकाउंट", + "REGISTER": "पंजीकरण ", + "REPORTS": "REPORTS", + "RESET": "रिसेट ", + "RESET PASSWORD": "पासवर्ड रीसेट करें", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "निर्माण के लिए APK को जारी करें ", + "Release APK to QA": "QA को APK ज़ारी करें ", + "Release PWA to Production": "निर्माण के लिए PWA को जारी करें ", + "Release PWA to QA": "QA को PWA ज़ारी करें |", + "Report": "Report", + "Report for": "Report for", + "Reports": "रिपोर्ट्स ", + "Response": "प्रतिक्रिया ", + "Restore Backup": "Restore Backup", + "Results": "Results", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "व्यू (VIEW) खोजें", + "START": "START", + "STOP": "STOP", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "सभी यूजर के लिए डाटा सिंक करें ", + "Save": "सेव करें ", + "Save before switching or your changes will be deleted.": "स्विच करने से पहले सेव करें अन्यथा आपके द्वारा किये गए परिवर्तन हट जायेंगे ", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "School", + "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "Searching", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "फॉर्म का नाम चुनें", + "Select Report": "Select Report", + "Select Student": "Select Student", + "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "एक या एक से अधिक का चयन करें ", + "Select only one": "केवल एक चुने ", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "अपना यूजरनेम चुनें ", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "सेटिंग्स ", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "शुरू करने का समय ", + "Status": "स्टेटस", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Student", + "Student Dashboard": "Student Dashboard", + "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Student Subtest Report", + "Students Assessed": "Students Assessed", + "Students to watch": "Students to watch", + "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Subtask", + "Subtest Name": "Subtest Name", + "Subtest Report": "Subtest Report", + "Success!": "Success!", + "Summary": "Summary", + "Support": "सहयोग ", + "Switch Editor": "स्विच एडिटर ", + "Sync": "Sync", + "Sync Successful": "सफलतापूर्वक सिंक ", + "Sync Unsuccessful. Please Retry": "सिंक असफल रहा कृपया दुबारा सिंक करें ", + "Syncing Status By User": "यूजर द्वारा सिंक करने का स्टेटस ", + "Syncing Status Summary": "Syncing Status Summary", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "किसी भी बॉक्स को टैप करे जो परीक्षण के समय गलत थे", + "Tap items to mark them incorrect.": "गलत चिन्हित करने के लिए आइटम पर टैप करें ", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "अंतिम प्रयास किये गए आइटम को टैप करें", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Task Report", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "App अब एप्लीकेशन अपडेट करने के लिए जाँच करेगा और डाउनलोड करने का प्रयास करेगा | कृपया इस प्रक्रिया के दौरान इन्टरनेट से जुड़ें रहे | आगे बढ़ने के लिए OK पर क्लिक करें ", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "फॉर्म अभी पूरा नहीं हुआ है क्या आप वास्तव में फॉर्म बंद करना चाहते हैं ?", + "There is unsaved data. Are you sure you would like to exit the form?": "डेटा अभी सेव नहीं हुआ है क्या आप वास्तव में फॉर्म बंद करना चाहते हैं ?", + "This Field is Required": "यह फील्ड आवश्यक है ", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "संकेत ", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "सम्पूर्ण ", + "Total Docs Uploaded": "अपलोड किये गए कुल डॉक्यूमेंट ", + "Total Docs not Uploaded": "कुल डॉक्यूमेंट जो अपलोड नहीं किये गए ", + "Total Percentage Complete": "कुल पूर्ण प्रतिशत ", + "Total Updates Applied": "लागू किये गए कुल अपडेट ", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "बाहर खुले आसमान में जाकर प्रयास करें ", + "Try standing away from trees or buildings": "वृक्षों और इमारतों से दूर खड़े होकर प्रयास करें ", + "Try standing next to a window": "खिड़की के पास खड़े होकर प्रयास करें ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "अपडेट नहीं हो पाया, सुनिश्चित करें कि आप इन्टरनेट से कनेक्ट हैं और पुनः प्रयास करें ", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "App को अपडेट करें", + "Update is Running. Please Wait ...": "अपडेट हो रहा है कृपया प्रतीक्षा करें", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "यूजर को ग्रुप में सफलतापूर्वक जोड़ा गया ", + "User Created Succesfully": "यूजर सफलतापूर्वक बनाया गया ", + "User Removed from Group Successfully": "यूजर को सफलतापूर्वक समूह से हटाया गया", + "Username": "Username", + "Username Available": "Username उपलब्ध है ", + "Username Unavailable": "Username उपलब्ध नहीं है ", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "अपना PWA देखें ", + "Visits": "विजिट्स", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "लिखना असफल ", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "resource का access नहीं है", + "You have not started this event": "आपने यह इवेंट शुरू नहीं किया है ", + "You have not started this form": "आपने यह फॉर्म शुरू नहीं किया है", + "You may not mark an item incorrect that is beyond the last item attempted.": "आप किसी आइटम को गलत चिन्हित नहीं कर सकते हैं जो किये गए अंतिम प्रयास से बाहर हो", + "You may proceed.": "आप आगे बढ़ सकते हैं ", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "आपका APK बन रहा है ", + "Your PWA is building...": "आपका PWA बन रहा है |", + "accept": "accept", + "and": "and", + "back": "back", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "close", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "events", + "here": "यहाँ ", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "lattitude", + "loading": "लोड हो रहा है", + "longitude": "Longitude", + "manifest": "manifest", + "merged": "merged", + "new case": "नया केस ", + "new form": "new form", + "new issue": "new issue", + "next": "next", + "no": "no", + "no, stop": "नहीं, रुकें", + "open": "open", + "open cases": "open cases", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "प्रतिक्रिया ", + "result": "result", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "सेव करें ", + "scan": "scan", + "searching": "searching", + "see form": "see form", + "start another": "दूसरा शुरू करें ", + "start event": "इवेंट शुरू करें ", + "start form": "फॉर्म शुरू करें ", + "submit": "submit", + "summary": "summary", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "हाँ, ज़ारी रखें ", + "✓ Yay! You are up to date.": "✓ Yay! आपका app अपडेट है", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." +} \ No newline at end of file diff --git a/translations/translation.ps.json b/translations/translation.ps.json index 32b3f0a2ec..4d405ff0c7 100644 --- a/translations/translation.ps.json +++ b/translations/translation.ps.json @@ -1,165 +1,441 @@ { -"Unable to check for update. Make sure you are connected to the Internet and try again.":"نشو کولاۍ چي اپډیت چک کړو. ډاډ ترلاسه کړئ چې تاسو د انټرنیټ سره وصل یاست او بیا هڅه وکړئ.", -"+ Create a New User":"+ نوی کارونکۍ جوړ کړئ", -"Accuracy":"دقت", -"Accuracy Level":"د دقت کچه", -"Add New User":"نوۍ کارونکۍ اضافه کړئ", -"An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"اپډیت شتون لري. ډاډ ترلاسه کړئ چې لومړی د معلوماتو له نصبولو دمخه خپل معلومات هممهاله (sync) کړئ. که تاسو دا نه وي کړي ، نو په `Cancel` کلیک وکړئ. که تاسو د اوسمهال نصبولو لپاره چمتو یاست ، نو په `Yes` یا هو کلیک وکړئ", -"Applying Updates...":"د اپډیټ د پلي کولو په حال کې...", -"Are you sure you want to start a form response?":"ایا تاسو ډاډه یاست چې غواړئ د فورمې ځواب پیل کړئ؟", -"There is unsaved data. Are you sure you would like to exit the form?":"دلته ناخوندي شوي معلومات شته. ایا تاسو باوري یاست چې غواړئ له فورمې ووځئ؟", -"The form is not yet complete. Are you sure you would like to exit the form?":"دا فورمه تراوسه نده بشپړه شوي. ایا تاسو باوري یاست چې غواړئ له فورمې ووځئ؟", -"The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"دغه ایپ (اپلیکیشن) به اوس د اپلیکیشن تازه کولو لپاره وګوري او د ډاونلوډ هڅه به وکړي. مهرباني وکړئ د دې پروسې په جریان کې له انټرنیټ سره وصل پاتې شئ. د پرمخ وړلو لپاره OK کلیک وکړئ.", -"Case":"قضیه", -"Cases":"قضیي", -"Check for Update":"د اپډیت لپاره چک کړئ", -"Checking For Updates...":"د اپډیت لپاره د چک په حال کې...", -"Choose which case type":"د قضیي ډول غوره کړئ", -"Click a Picture":"پر انځور (Picture) کلیک وکړئ", -"Click the play button to get started.":"د پیل پر تڼۍ کلیک وکړئ ترڅو پیل شي", -"Click to Download":"د ډاونلوډ لپاره کلیک وکړئ", -"Close":"وتړئ", -"close":"وتړئ", -"Confirm New Password":"نوۍ پټ نوم تایید کړئ", -"Confirm Password":"پټ نوم تایید کړئ", -"Could Not Contact Server.":"د سرور سره وصل نشو.", -"Could Not Create User":"کارونکۍ جوړ نکړاۍ شوای", -"Could Not Generate APK":"APK جوړ نکړای شوای", -"Could Not Generate PWA":"PWA جوړ نکړای شوای", -"Complete":"بشپړ", -"Date and Time":"نیټه او وخت", -"Distance from reference":"د ریفرینس سره واټن", -"Docs Not Uploaded":"دوسیي اپلوډ نشول", -"Docs Uploaded":"دوسیي اپلوډ شول", -"EXPORT DATA FOR ALL USERS":"د ټولو کارونکو لپاره د صادرولو معلومات", -"Edit Item":"د مورد سمون", -"Email":"بریښنالیک", -"Enter your response to above question here":"پورته پوښتنې ته خپل ځواب دلته دننه کړئ", -"Error Downloading File":"د فایل په ډاونلوډ کې خطا وه", -"Event":"پیښه", -"events":"پیښي", -"Export Data":"صادرولو معلومات", -"File Stored At":"فایل ذخیره شوی په", -"Filter":"فیلټر", -"First Name":"لومړۍ نوم", -"Form":"فورمه", -"Form Id":"د فورمي آی ډي", -"Form Name":"د فورمي نوم", -"Form Title":"د فورمي سرلیک", -"Group Created Succesfully":"ګروپ په بریالیتوب سره جوړ شو", -"Group Details":"د ګروپ توضیحات", -"Group Name":"د ګروپ نوم", -"Help":"مرسته", -"Incomplete":"نیمګړۍ", -"Item Listing":"د موارد لیسټ", -"Item Not Found":"مورد ونه موندل شو", -"Item Title":"د مورد سرلیک", -"LAST ATTEMPTED":"ورستۍ هڅه", -"LOGIN":"ننوتل", -"Last Name":"تخلص", -"Last Successful Sync Timestamp":"د وروستۍ هممهالي د وخت یادداښت", -"Last attempted cannot be before an item marked.":"ورستۍ هڅه د نښه شوي مورد مخکي نشي راتلی.", -"Latitude":"عرض البلد", -"latitude":"عرض البلد", -"Loading":"لوډ کیدل", -"loading":"لوډ کیدل", -"Login":"ننوتل", -"Login Unsuccesful":"ننوتل بریالی نه وو", -"Logout":"وتل", -"Longitude":"طول البلد", -"longitude":"طول البلد", -"MARK":"نښه کول", -"manifest":"څرګند", -"Meters":"میټر", -"My Forms":"زما فورمې", -"new case":"نوي قضیه", -"New Password":"نوۍ پټ نوم", -"No Data for":"لپاره یي هیڅ معلومات نشته", -"No Forms Currently Defined":"د اوس لپاره هیڅ ډول فورمې نه دي تعریف شوي", -"No Update":"هیڅ ډول اپډيت نشته", -"Observations":"کتنې", -"Open":"پرانیستل", -"open":"پرانیستل", -"Opened":"پرانیستل شوی وو", -"Open a Case":"د یوي قضیي پرانیستل", -"open cases":"د قضیي پرانیستل", -"Password":"پټ نوم", -"Password Reset Unsuccesful":"د پټ نوم بیا ټاکل بریالی نه وو", -"Passwords do not match":"پټ نومونه یوشانته ندي", -"Percentage Complete":"سلنه بشپړ شول", -"Permission Denied.":"اجازه ورنکړل شو.", -"Permission Denied. Login to Continue":"اجازه ورنکړل شو. ننوتل ادامه لري", -"Pick a":"یو غوره کړئ", -"Please enter a valid email address":"مهرباني وکړئ یو بااعتباره بریښنالیک آدرس دننه کړئ", -"Progress":"پرمختګ", -"Projects":"پروژې", -"RECOVER ACCOUNT":"د اکاونټ بیاسمول", -"REGISTER":"راجستر کول", -"RESET":"بیرته سټ کول", -"RESET PASSWORD":"د پټ نوم بیرته سټ کول", -"Reports":"رپوټونه", -"Response":"ځواب", -"response":"ځواب", -"START":"پیل", -"STOP":"بندول", -"SYNC DATA FOR ALL USERS":"د ټولو کارونکو لپاره د هممهالۍ معلومات", -"Save":"ثبتول", -"save":"ثبتول", -"Save before switching or your changes will be deleted.":"د بدلولو مخکي ثبت وکړئ که نه نو ټول بدلونونه به له منځه لاړ شي.", -"School":"ښوونځۍ", -"Searching":"لټون", -"searching":"لټون", -"Select one or more":"یو یا ډیر غوره کړئ", -"Select only one":"یوازي یو غوره کړئ", -"Select your Username":"خپل د کاروني نوم (یوزرنیم) غوره کړئ", -"Settings":"تنظیمات", -"start another":"بل یو پیل کړئ", -"start event":"پیښه پیل کړئ", -"start form":"فورمه پیل کړئ", -"Start Time":"د پیل وخت", -"Status":"وضعیت", -"submit":"ولیږدۍ", -"Summary":"لنډیز", -"summary":"لنډیز", -"Support":"مرسته کول", -"Sync":"هممهالي", -"Sync Successful":"هممهالي په بریالیتوب سره ترسره شو", -"Sync Unsuccessful. Please Retry":"هممهالي په بریالیتوب سره ترسره نشو. مهرباني وکړئ بیا هڅه وکړئ", -"Syncing Status By User":"د هممهالي وضعیت د کاروونکي پر اساس", -"Syncing Status Summary":"د همهمالي وضعیت لنډيز", -"Tangerine":"Tangerine", -"Tap any boxes that were incorrect during the test.":"ټول هغه بکسي غوره کړئ کوم چي د ازمویني په مودي کي غلط وه.", -"Tap items to mark them incorrect.":"پر مواردو کلیک وکړئ کوم چي غلط دي.", -"Tap the item last attempted.":"هغه مورد چي وروستۍ کي هڅه یي شوي کلیک کړئ.", -"This Field is Required":"دا ساحه لازمي ده", -"Tips":"لارښووني", -"Total":"مجموعه", -"Total Docs Uploaded":"د اپلوډ شوي دوسیو مجموعه", -"Total Docs not Uploaded":"مجموعه دوسیي اپلوډ شوي ندي", -"Total Percentage Complete":"مجموعه سلنه بشپړ شول", -"Total Updates Applied":"ټول هغه اپډیټ چي پلي شوي", -"Try moving outside with a clear view of the sky":"هڅه وکړئ دباندي ووځئ او د آسمان ښه منظر ولرئ", -"Try standing away from trees or buildings":"هڅه وکړئ د ونو یا تعمیر څخه لیري واوسئ", -"Try standing next to a window":"هڅه وکړئ د کړکۍ څنګ ته ودریږئ", -"Update App":"اپلیکشیشن اپډیت کړئ", -"Update is Running. Please Wait ...":"اپډیت د چلیدو په حال کې. مهرباني وکړئ انتظار وباسئ...", -"User Added to Group Successfully":"په ګروپ کې کارونکۍ په بریالیتوب سره اضافه شو", -"User Created Succesfully":"کارونکۍ په بریالیتوب سره جوړ شو", -"User Removed from Group Successfully":"د ګروپ څخه کارونکۍ په بریالیتوب سره لرې شو", -"Username":"د کاروني نوم", -"Username Available":"د کاروني نوم شتون لري", -"Username Unavailable":"د کاروني نوم شتون نه لري", -"Visits":"لیدنې", -"Write Failed":"لیکنه ناکامه شوه.", -"You do not have access to the resource.":"تاسو سرچینو ته لاسرسی نلرئ.", -"You have not started this event":"تاسو دا پیښه نه ده پیل کړې", -"You have not started this form":"تاسو دا فورمه نه ده پیل کړې", -"You may not mark an item incorrect that is beyond the last item attempted.":"تاسو ممکن هغه مورد غلط نښه نه کړئ چې د هڅه کولو وروستي مورد څخه هاخوا وي.", -"You may proceed.":"تاسو ممکن پرمخ لاړ شئ.", -"✓ Yay! You are up to date.":"✓ Yay! تاسو برنامه اپډیت کړل.", -"yes, continue":"هو، ادامه ورکړئ", -"no, stop":"نه، بند یي کړئ", -"SEARCH VIEW":"د لټون لید (Search View)", -"next":"بل", -"back":"بیرته شاته" -} + "% Correct": "% Correct", + "+ Add User to Group": "+ Add User to Group", + "+ Create a New Form": "+ Create a New Form", + "+ Create a New Group": "+ Create a New Group", + "+ Create a New User": "+ نوی کارونکۍ جوړ کړئ", + "About": "About", + "Accuracy": "دقت", + "Accuracy Level": "د دقت کچه", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Add Class", + "Add New User": "نوۍ کارونکۍ اضافه کړئ", + "Add Student": "Add Student", + "Add User to Group": "Add User to Group", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "اپډیت شتون لري. ډاډ ترلاسه کړئ چې لومړی د معلوماتو له نصبولو دمخه خپل معلومات هممهاله (sync) کړئ. که تاسو دا نه وي کړي ، نو په `Cancel` کلیک وکړئ. که تاسو د اوسمهال نصبولو لپاره چمتو یاست ، نو په `Yes` یا هو کلیک وکړئ", + "Applying Updates...": "د اپډیټ د پلي کولو په حال کې...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "ایا تاسو ډاډه یاست چې غواړئ د فورمې ځواب پیل کړئ؟", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Average", + "Average Correct": "Average Correct", + "Average Correct (%)": "Average Correct (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "قضیه", + "Cases": "قضیي", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "د اپډیت لپاره چک کړئ", + "Checking": "Checking", + "Checking For Updates...": "د اپډیت لپاره د چک په حال کې...", + "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", + "Choose type...": "Choose type...", + "Choose which case type": "د قضیي ډول غوره کړئ", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Class grouping", + "Classes": "Classes", + "Click a Picture": "پر انځور (Picture) کلیک وکړئ", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "د پیل پر تڼۍ کلیک وکړئ ترڅو پیل شي", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "د ډاونلوډ لپاره کلیک وکړئ", + "Close": "وتړئ", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "بشپړ", + "Completed?": "Completed?", + "Concerning": "Concerning", + "Confirm New Password": "نوۍ پټ نوم تایید کړئ", + "Confirm Password": "پټ نوم تایید کړئ", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "د سرور سره وصل نشو.", + "Could Not Create User": "کارونکۍ جوړ نکړاۍ شوای", + "Could Not Generate APK": "APK جوړ نکړای شوای", + "Could Not Generate PWA": "PWA جوړ نکړای شوای", + "Could Not Load List Of Forms": "Could Not Load List Of Forms", + "Create": "Create", + "Create Form": "Create Form", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "نیټه او وخت", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "د ریفرینس سره واټن", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "دوسیي اپلوډ نشول", + "Docs Uploaded": "دوسیي اپلوډ شول", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Download CSV", + "Download your APK": "Download your APK", + "EXPORT DATA FOR ALL USERS": "د ټولو کارونکو لپاره د صادرولو معلومات", + "Edit Item": "د مورد سمون", + "Email": "بریښنالیک", + "End Date": "End Date", + "Enter your response to above question here": "پورته پوښتنې ته خپل ځواب دلته دننه کړئ", + "Error Downloading File": "د فایل په ډاونلوډ کې خطا وه", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "پیښه", + "Export Backup": "Export Backup", + "Export Data": "صادرولو معلومات", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "فایل ذخیره شوی په", + "File restored from ": "File restored from ", + "Filter": "فیلټر", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "لومړۍ نوم", + "Form": "فورمه", + "Form Id": "د فورمي آی ډي", + "Form Name": "د فورمي نوم", + "Form Title": "د فورمي سرلیک", + "Forms": "Forms", + "Generate APK/PWA": "Generate APK/PWA", + "Generating CSV": "Generating CSV", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Good", + "Grade": "Grade", + "Great": "Great", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Group", + "Group Created Succesfully": "ګروپ په بریالیتوب سره جوړ شو", + "Group Details": "د ګروپ توضیحات", + "Group Name": "د ګروپ نوم", + "Grouping Report": "Grouping Report", + "Help": "مرسته", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "نیمګړۍ", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "د موارد لیسټ", + "Item Not Found": "مورد ونه موندل شو", + "Item Title": "د مورد سرلیک", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "ورستۍ هڅه", + "LOGIN": "ننوتل", + "Last Name": "تخلص", + "Last Successful Sync Timestamp": "د وروستۍ هممهالي د وخت یادداښت", + "Last attempted cannot be before an item marked.": "ورستۍ هڅه د نښه شوي مورد مخکي نشي راتلی.", + "Latitude": "عرض البلد", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "لوډ کیدل", + "Location": "Location", + "Login": "ننوتل", + "Login Unsuccesful": "ننوتل بریالی نه وو", + "Logout": "وتل", + "Longitude": "طول البلد", + "MARK": "نښه کول", + "Maintenance": "Maintenance", + "Manage Groups": "Manage Groups", + "Manage Profile": "Manage Profile", + "Manage Users": "Manage Users", + "March": "March", + "May": "May", + "Mediocre": "Mediocre", + "Meters": "میټر", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "زما فورمې", + "Name": "Name", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "New Form", + "New Group": "New Group", + "New Item": "New Item", + "New Password": "نوۍ پټ نوم", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "لپاره یي هیڅ معلومات نشته", + "No Forms Currently Defined": "د اوس لپاره هیڅ ډول فورمې نه دي تعریف شوي", + "No Students currently registered.": "No Students currently registered.", + "No Update": "هیڅ ډول اپډيت نشته", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "کتنې", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "پرانیستل", + "Open a Case": "د یوي قضیي پرانیستل", + "Opened": "پرانیستل شوی وو", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "پټ نوم", + "Password Reset Unsuccesful": "د پټ نوم بیا ټاکل بریالی نه وو", + "Password is required": "Password is required", + "Passwords do not match": "پټ نومونه یوشانته ندي", + "Percentage Complete": "سلنه بشپړ شول", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentile", + "Permission Denied.": "اجازه ورنکړل شو.", + "Permission Denied. Login to Continue": "اجازه ورنکړل شو. ننوتل ادامه لري", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "یو غوره کړئ", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "مهرباني وکړئ یو بااعتباره بریښنالیک آدرس دننه کړئ", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Poor", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "پرمختګ", + "Projects": "پروژې", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "د اکاونټ بیاسمول", + "REGISTER": "راجستر کول", + "REPORTS": "REPORTS", + "RESET": "بیرته سټ کول", + "RESET PASSWORD": "د پټ نوم بیرته سټ کول", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Release APK to Production", + "Release APK to QA": "Release APK to QA", + "Release PWA to Production": "Release PWA to Production", + "Release PWA to QA": "Release PWA to QA", + "Report": "Report", + "Report for": "Report for", + "Reports": "رپوټونه", + "Response": "ځواب", + "Restore Backup": "Restore Backup", + "Results": "Results", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "د لټون لید (Search View)", + "START": "پیل", + "STOP": "بندول", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "د ټولو کارونکو لپاره د هممهالۍ معلومات", + "Save": "ثبتول", + "Save before switching or your changes will be deleted.": "د بدلولو مخکي ثبت وکړئ که نه نو ټول بدلونونه به له منځه لاړ شي.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "ښوونځۍ", + "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "لټون", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Select Form Name", + "Select Report": "Select Report", + "Select Student": "Select Student", + "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "یو یا ډیر غوره کړئ", + "Select only one": "یوازي یو غوره کړئ", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "خپل د کاروني نوم (یوزرنیم) غوره کړئ", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "تنظیمات", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "د پیل وخت", + "Status": "وضعیت", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Student", + "Student Dashboard": "Student Dashboard", + "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Student Subtest Report", + "Students Assessed": "Students Assessed", + "Students to watch": "Students to watch", + "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Subtask", + "Subtest Name": "Subtest Name", + "Subtest Report": "Subtest Report", + "Success!": "Success!", + "Summary": "لنډیز", + "Support": "مرسته کول", + "Switch Editor": "Switch Editor", + "Sync": "هممهالي", + "Sync Successful": "هممهالي په بریالیتوب سره ترسره شو", + "Sync Unsuccessful. Please Retry": "هممهالي په بریالیتوب سره ترسره نشو. مهرباني وکړئ بیا هڅه وکړئ", + "Syncing Status By User": "د هممهالي وضعیت د کاروونکي پر اساس", + "Syncing Status Summary": "د همهمالي وضعیت لنډيز", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "ټول هغه بکسي غوره کړئ کوم چي د ازمویني په مودي کي غلط وه.", + "Tap items to mark them incorrect.": "پر مواردو کلیک وکړئ کوم چي غلط دي.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "هغه مورد چي وروستۍ کي هڅه یي شوي کلیک کړئ.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Task Report", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "دغه ایپ (اپلیکیشن) به اوس د اپلیکیشن تازه کولو لپاره وګوري او د ډاونلوډ هڅه به وکړي. مهرباني وکړئ د دې پروسې په جریان کې له انټرنیټ سره وصل پاتې شئ. د پرمخ وړلو لپاره OK کلیک وکړئ.", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "دا فورمه تراوسه نده بشپړه شوي. ایا تاسو باوري یاست چې غواړئ له فورمې ووځئ؟", + "There is unsaved data. Are you sure you would like to exit the form?": "دلته ناخوندي شوي معلومات شته. ایا تاسو باوري یاست چې غواړئ له فورمې ووځئ؟", + "This Field is Required": "دا ساحه لازمي ده", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "لارښووني", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "مجموعه", + "Total Docs Uploaded": "د اپلوډ شوي دوسیو مجموعه", + "Total Docs not Uploaded": "مجموعه دوسیي اپلوډ شوي ندي", + "Total Percentage Complete": "مجموعه سلنه بشپړ شول", + "Total Updates Applied": "ټول هغه اپډیټ چي پلي شوي", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "هڅه وکړئ دباندي ووځئ او د آسمان ښه منظر ولرئ", + "Try standing away from trees or buildings": "هڅه وکړئ د ونو یا تعمیر څخه لیري واوسئ", + "Try standing next to a window": "هڅه وکړئ د کړکۍ څنګ ته ودریږئ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "نشو کولاۍ چي اپډیت چک کړو. ډاډ ترلاسه کړئ چې تاسو د انټرنیټ سره وصل یاست او بیا هڅه وکړئ.", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "اپلیکشیشن اپډیت کړئ", + "Update is Running. Please Wait ...": "اپډیت د چلیدو په حال کې. مهرباني وکړئ انتظار وباسئ...", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "په ګروپ کې کارونکۍ په بریالیتوب سره اضافه شو", + "User Created Succesfully": "کارونکۍ په بریالیتوب سره جوړ شو", + "User Removed from Group Successfully": "د ګروپ څخه کارونکۍ په بریالیتوب سره لرې شو", + "Username": "د کاروني نوم", + "Username Available": "د کاروني نوم شتون لري", + "Username Unavailable": "د کاروني نوم شتون نه لري", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "View your PWA", + "Visits": "لیدنې", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "لیکنه ناکامه شوه.", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "تاسو سرچینو ته لاسرسی نلرئ.", + "You have not started this event": "تاسو دا پیښه نه ده پیل کړې", + "You have not started this form": "تاسو دا فورمه نه ده پیل کړې", + "You may not mark an item incorrect that is beyond the last item attempted.": "تاسو ممکن هغه مورد غلط نښه نه کړئ چې د هڅه کولو وروستي مورد څخه هاخوا وي.", + "You may proceed.": "تاسو ممکن پرمخ لاړ شئ.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "Your APK is building...", + "Your PWA is building...": "Your PWA is building...", + "accept": "accept", + "and": "and", + "back": "بیرته شاته", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "وتړئ", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "پیښي", + "here": "here", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "عرض البلد", + "loading": "لوډ کیدل", + "longitude": "طول البلد", + "manifest": "څرګند", + "merged": "merged", + "new case": "نوي قضیه", + "new form": "new form", + "new issue": "new issue", + "next": "بل", + "no": "no", + "no, stop": "نه، بند یي کړئ", + "open": "پرانیستل", + "open cases": "د قضیي پرانیستل", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "ځواب", + "result": "result", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "ثبتول", + "scan": "scan", + "searching": "لټون", + "see form": "see form", + "start another": "بل یو پیل کړئ", + "start event": "پیښه پیل کړئ", + "start form": "فورمه پیل کړئ", + "submit": "ولیږدۍ", + "summary": "لنډیز", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "هو، ادامه ورکړئ", + "✓ Yay! You are up to date.": "✓ Yay! تاسو برنامه اپډیت کړل.", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." +} \ No newline at end of file diff --git a/translations/translation.pt.json b/translations/translation.pt.json index f788fe701a..5dac1d612a 100644 --- a/translations/translation.pt.json +++ b/translations/translation.pt.json @@ -1,229 +1,441 @@ { - "Unable to check for update. Make sure you are connected to the Internet and try again.":"Incapaz de verificar a sua actualização. Certifique-se de que está ligado à Internet e tente novamente.", - "+ Add User to Group":"+ Adicionar Utilizador ao Grupo", - "+ Create a New Form":"+ Criar um novo formulário", - "+ Create a New Group":"+ Criar um Novo Grupo", - "+ Create a New User":"+ Criar um Novo Utilizador", - "Accuracy":"Precisão", - "Accuracy Level":"Nível de exactidão", - "Add New User":"Adicionar Novo Utilizador", - "Add User to Group":"Adicionar Utilizador ao Grupo", - "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"Está disponível uma actualização. Certifique-se de que primeiro sincroniza os seus dados antes de instalar a actualização. Se não o tiver feito, clique em “Cancelar“. Se estiver pronto para instalar a actualização, clique em “Sim“.", - "Applying Updates...":"Aplicar Actualizações...", - "Are you sure you want to start a form response?":"Tem a certeza de que quer começar uma resposta de formulário?", - "There is unsaved data. Are you sure you would like to exit the form?":"Existem dados não guardados. Tem a certeza de que gostaria de sair do formulário?", - "The form is not yet complete. Are you sure you would like to exit the form?":"O formulário ainda não está completo. Tem a certeza de que gostaria de sair do formulário?", - "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"A aplicação irá agora verificar a actualização da aplicação e tentar descarregar. Por favor, mantenha-se ligado à Internet durante este processo. Toque em OK para prosseguir.", - "Case":"Caso", - "Cases":"Casos", - "Check for Update":"Verificar por Actualização", - "Checking For Updates...":"Verificação de Actualizações...", - "Choose which case type":"Escolha que tipo de caso", - "Click a Picture":"Clique numa imagem", - "Click the play button to get started.":"Clique no botão iniciar para começar.", - "Click to Download":"Clique para descarregar", - "Close":"Fechar", - "close":"fechar", - "Confirm New Password":"Confirmar nova senha", - "Confirm Password":"Confirmar Palavra-passe", - "Could Not Contact Server.":"Não foi possível contactar o Servidor.", - "Could Not Create User":"Não foi possível criar utilizador", - "Could Not Generate APK":"Não pôde gerar APK", - "Could Not Generate PWA":"Não pôde gerar AWP", - "Could Not Load List Of Forms":"Não foi possível carregar a Lista de Formulários", - "Complete":"Completo", - "Create Form":"Criar formulário", - "Date and Time":"Data e Hora", - "Distance from reference":"Distância da referência", - "Docs Not Uploaded":"Documentos não carregados", - "Docs Uploaded":"Documentos enviados", - "Download CSV":"Descarregar CSV", - "Download your APK":"Descarregue o seu APK", - "EXPORT DATA FOR ALL USERS":"DADOS DE EXPORTAÇÃO PARA TODOS OS UTILIZADORES", - "Edit Item":"Editar Item", - "Email":"Email", - "Enter your response to above question here":"Introduza aqui a sua resposta à pergunta acima", - "Error Downloading File":"Erro ao descarregar ficheiro", - "Event":"Evento", - "events":"eventos", - "Export Data":"Dados de exportação", - "File Stored At":"Arquivo Armazenado em", - "Filter":"Filtro", - "First Name":"Nome", - "Form":"Formulário", - "Form Id":"Formulário Id", - "Form Name":"Nome do formulário", - "Form Title":"Título do formulário", - "Forms":"Formulários", - "Generate APK/PWA":"Gerar APK/PWA", - "Generating CSV":"Gerar o CSV", - "Group":"Grupo", - "Group Created Succesfully":"Grupo Criado com Sucesso", - "Group Details":"Detalhes do grupo", - "Group Name":"Nome do grupo", - "Help":"Ajuda", - "Incomplete":"Incompleto", - "Item Listing":"Listagem de itens", - "Item Not Found":"Item Não Encontrado", - "Item Title":"Título do artigo", - "LAST ATTEMPTED":"ÚLTIMO ATENTADO", - "LOGIN":"LOGIN", - "Last Name":"Sobrenome", - "Last Successful Sync Timestamp":"Último Sync Timestamp bem sucedido", - "Last attempted cannot be before an item marked.":"O item marcado como “última tentative” não pode estar antes de um item marcado.", - "Latitude":"Latitude", - "latitude":"latitude", - "Loading":"Carregamento", - "loading":"carregamento", - "Login":"Login", - "Login Unsuccesful":"Login Unsuccesful", - "Logout":"Sair", - "Longitude":"Longitude", - "longitude":"longitude", - "MARK":"MARCAR", - "Manage Groups":"Gerir Grupos", - "Manage Profile":"Gerir Perfil", - "Manage Users":"Gerir Utilizadores", - "manifest":"manifesto", - "Meters":"Medidores", - "My Forms":"Os meus formulários", - "new case":"novo caso", - "New Form":"Novo formulário", - "New Group":"Novo Grupo", - "New Item":"Novo item", - "New Password":"Nova Palavra-passe", - "No Data for":"Sem dados para", - "No Forms Currently Defined":"Sem Formulários Definidos de momento", - "No Update":"Sem Actualização", - "Observations":"Observações", - "Open":"Aberto", - "open":"abrir", - "Opened":"Aberto", - "Open a Case":"Abrir um caso", - "open cases":"casos abertos", - "Password":"Senha", - "Password Reset Unsuccesful":"Reinicialização da palavra-passe sem successo", - "Passwords do not match":"As palavras-passe não coincidem", - "Percentage Complete":"Percentagem Completa", - "Permission Denied.":"Permissão negada.", - "Permission Denied. Login to Continue":"Permissão negada. Login para continuar", - "Pick a":"Escolha um", - "Please enter a valid email address":"Por favor, introduza um endereço de correio eletrónico válido", - "Progress":"Progresso", - "Projects":"Projetos", - "RECOVER ACCOUNT":"RECUPERAR CONTA", - "REGISTER":"INSCREVA-SE", - "RESET":"REDEFINIR", - "RESET PASSWORD":"REDEFINIR SENHA ", - "Release APK to Production":"Liberar APK para a produção", - "Release APK to QA":"Liberar APK para QA", - "Release PWA to Production":"Liberar o AWP para a produção", - "Release PWA to QA":"Liberar PWA para QA", - "Reports":"Relatórios", - "Response":"Resposta", - "response":"resposta", - "START":"INICIAR", - "STOP":"STOP", - "SYNC DATA FOR ALL USERS":"SINCRONIZAR DADOS PARA TODOS OS UTILIZADORES", - "Save":"Guardar", - "save":"exceto", - "Save before switching or your changes will be deleted.":"Guarde antes de mudar ou as suas alterações serão apagadas.", - "School":"Escola", - "Searching":"A pesquisar", - "searching":"pesquisa", - "Select Form Name":"Selecione o nome do formulário", - "Select one or more":"Selecione um ou mais", - "Select only one":"Selecione apenas um", - "Select your Username":"Selecione o seu nome de utilizador", - "Settings":"Definições", - "start another":"iniciar outro", - "start event":"evento inicial", - "start form":"formulário de início", - "Start Time":"Hora de início", - "Status":"Estado", - "submit":"submeter", - "Summary":"Resumo", - "summary":"resumo", - "Support":"Apoio", - "Switch Editor":"Switch Editor", - "Sync":"Tradução: Equipa PT-Subs", - "Sync Successful":"Sync Sucesso", - "Sync Unsuccessful. Please Retry":"Sync sem sucesso. Por favor, tente novamente", - "Syncing Status By User":"Estado de Sincronização por Utilizador", - "Syncing Status Summary":"Resumo do estado de sincronização", - "Tangerine":"Tangerine", - "Tap any boxes that were incorrect during the test.":"Toque em todas as caixas que estivessem incorretas durante o teste.", - "Tap items to mark them incorrect.":"Toque nos itens para os marcar incorretamente.", - "Tap the item last attempted.":"Tocar no ultimo item tentado", - "This Field is Required":"Este Campo é Necessário", - "Tips":"Dicas", - "Total":"Total", - "Total Docs Uploaded":"Total de documentos enviados", - "Total Docs not Uploaded":"Total de documentos não carregados", - "Total Percentage Complete":"Percentagem Total Completa", - "Total Updates Applied":"Total de atualizações aplicadas", - "Try moving outside with a clear view of the sky":"Tente mover-se para fora com uma visão clara do céu", - "Try standing away from trees or buildings":"Tente ficar longe de árvores ou edifícios", - "Try standing next to a window":"Tente ficar ao lado de uma janela", - "Update App":"Atualização do App", - "Update is Running. Please Wait ...":"A atualização está em curso. Por favor, aguarde ...", - "User Added to Group Successfully":"Utilizador adicionado ao grupo com sucesso", - "User Created Succesfully":"Utilizador Criado com Sucesso", - "User Removed from Group Successfully":"Utilizador Removido do Grupo com Sucesso", - "Username":"Nome de utilizador", - "Username Available":"Nome de utilizador disponível", - "Username Unavailable":"Nome de utilizador indisponível", - "View your PWA":"Ver o seu AWP", - "Visits":"Visitas", - "Write Failed":"Escreva falhou", - "You do not have access to the resource.":"Não tem acesso ao recurso.", - "You have not started this event":"Ainda não iniciou este evento", - "You have not started this form":"Ainda não iniciou este formulário", - "You may not mark an item incorrect that is beyond the last item attempted.":"Não se pode marcar um item incorreto que esteja para além do último item tentado.", - "You may proceed.":"Pode prosseguir.", - "Your APK is building...":"O seu APK está a construir...", - "Your PWA is building...":"O seu AWP está a construir...", - "here":"aqui", - "✓ Yay! You are up to date.":"✓ Yay! Está atualizado", - "yes, continue":"sim, continuar", - "no, stop":"não, parar", - "SEARCH VIEW":"VISTA DE PESQUISA", - "next":"próximo", - "back":"voltar", - "Average Correct (%)":"Correção média (%)", - "Average Correct":"Média Correta", - "Students to watch":"Alunos a observar", - "Feedback":"Feedback", - "Add Student":"Adicionar aluno", - "Add Class":"Adicionar classe", - "Select Report":"Selecionar Relatório", - "Class grouping":"Agrupamento de classes", - "Student Subtest Report":"Relatório de Sub-teste do aluno", - "Task Report":"Relatório de Tarefa", - "Choose a task report from one of the following selections":"Escolha um relatório de tarefa de uma das seguintes seleções", - "SubTask Report":"Relatório da SubTask", - "Subtask":"Sub-tarefa", - "Average":"Média", - "Students Assessed":"Alunos Avaliados", - "Grouping Report":"Relatório de Agrupamento", - "Name":"Nome", - "Status":"Estado", - "Student Grouping":"Agrupamento de alunos", - "Student":"Aluno", - "Score":"Pontuação", - "Percentile":"Percentil", - "Great":"Ótimo", - "Good":"Bom", - "Mediocre":"Medíocre", - "Poor":"Pobre", - "Concerning":"Relativamente a", - "result":"resultado", - "Completed?":"Concluído?", - "Student":"Aluno", - "Student Dashboard":"Painel do aluno", - "Select Subtask":"Selecione Subtarefa", - "SUBMIT":"SUBMIT", - "Subtest Report":"Relatório de sub-teste", - "Select Student":"Selecione Aluno", - "Results":"Resultados" -} + "% Correct": "% Correct", + "+ Add User to Group": "+ Adicionar Utilizador ao Grupo", + "+ Create a New Form": "+ Criar um novo formulário", + "+ Create a New Group": "+ Criar um Novo Grupo", + "+ Create a New User": "+ Criar um Novo Utilizador", + "About": "About", + "Accuracy": "Precisão", + "Accuracy Level": "Nível de exactidão", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Adicionar classe", + "Add New User": "Adicionar Novo Utilizador", + "Add Student": "Adicionar aluno", + "Add User to Group": "Adicionar Utilizador ao Grupo", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Está disponível uma actualização. Certifique-se de que primeiro sincroniza os seus dados antes de instalar a actualização. Se não o tiver feito, clique em “Cancelar“. Se estiver pronto para instalar a actualização, clique em “Sim“.", + "Applying Updates...": "Aplicar Actualizações...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "Tem a certeza de que quer começar uma resposta de formulário?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Média", + "Average Correct": "Média Correta", + "Average Correct (%)": "Correção média (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "Caso", + "Cases": "Casos", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "Verificar por Actualização", + "Checking": "Checking", + "Checking For Updates...": "Verificação de Actualizações...", + "Choose a task report from one of the following selections:": "Escolha um relatório de tarefa de uma das seguintes seleções", + "Choose type...": "Choose type...", + "Choose which case type": "Escolha que tipo de caso", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Agrupamento de classes", + "Classes": "Classes", + "Click a Picture": "Clique numa imagem", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "Clique no botão iniciar para começar.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "Clique para descarregar", + "Close": "Fechar", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "Completo", + "Completed?": "Concluído?", + "Concerning": "Relativamente a", + "Confirm New Password": "Confirmar nova senha", + "Confirm Password": "Confirmar Palavra-passe", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "Não foi possível contactar o Servidor.", + "Could Not Create User": "Não foi possível criar utilizador", + "Could Not Generate APK": "Não pôde gerar APK", + "Could Not Generate PWA": "Não pôde gerar AWP", + "Could Not Load List Of Forms": "Não foi possível carregar a Lista de Formulários", + "Create": "Create", + "Create Form": "Criar formulário", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "Data e Hora", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Distância da referência", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "Documentos não carregados", + "Docs Uploaded": "Documentos enviados", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Descarregar CSV", + "Download your APK": "Descarregue o seu APK", + "EXPORT DATA FOR ALL USERS": "DADOS DE EXPORTAÇÃO PARA TODOS OS UTILIZADORES", + "Edit Item": "Editar Item", + "Email": "Email", + "End Date": "End Date", + "Enter your response to above question here": "Introduza aqui a sua resposta à pergunta acima", + "Error Downloading File": "Erro ao descarregar ficheiro", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "Evento", + "Export Backup": "Export Backup", + "Export Data": "Dados de exportação", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "Arquivo Armazenado em", + "File restored from ": "File restored from ", + "Filter": "Filtro", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "Nome", + "Form": "Formulário", + "Form Id": "Formulário Id", + "Form Name": "Nome do formulário", + "Form Title": "Título do formulário", + "Forms": "Formulários", + "Generate APK/PWA": "Gerar APK/PWA", + "Generating CSV": "Gerar o CSV", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Bom", + "Grade": "Grade", + "Great": "Ótimo", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Grupo", + "Group Created Succesfully": "Grupo Criado com Sucesso", + "Group Details": "Detalhes do grupo", + "Group Name": "Nome do grupo", + "Grouping Report": "Relatório de Agrupamento", + "Help": "Ajuda", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "Incompleto", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "Listagem de itens", + "Item Not Found": "Item Não Encontrado", + "Item Title": "Título do artigo", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "ÚLTIMO ATENTADO", + "LOGIN": "LOGIN", + "Last Name": "Sobrenome", + "Last Successful Sync Timestamp": "Último Sync Timestamp bem sucedido", + "Last attempted cannot be before an item marked.": "O item marcado como “última tentative” não pode estar antes de um item marcado.", + "Latitude": "Latitude", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "Carregamento", + "Location": "Location", + "Login": "Login", + "Login Unsuccesful": "Login Unsuccesful", + "Logout": "Sair", + "Longitude": "Longitude", + "MARK": "MARCAR", + "Maintenance": "Maintenance", + "Manage Groups": "Gerir Grupos", + "Manage Profile": "Gerir Perfil", + "Manage Users": "Gerir Utilizadores", + "March": "March", + "May": "May", + "Mediocre": "Medíocre", + "Meters": "Medidores", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "Os meus formulários", + "Name": "Nome", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "Novo formulário", + "New Group": "Novo Grupo", + "New Item": "Novo item", + "New Password": "Nova Palavra-passe", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "Sem dados para", + "No Forms Currently Defined": "Sem Formulários Definidos de momento", + "No Students currently registered.": "No Students currently registered.", + "No Update": "Sem Actualização", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "Observações", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Aberto", + "Open a Case": "Abrir um caso", + "Opened": "Aberto", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "Senha", + "Password Reset Unsuccesful": "Reinicialização da palavra-passe sem successo", + "Password is required": "Password is required", + "Passwords do not match": "As palavras-passe não coincidem", + "Percentage Complete": "Percentagem Completa", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentil", + "Permission Denied.": "Permissão negada.", + "Permission Denied. Login to Continue": "Permissão negada. Login para continuar", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "Escolha um", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "Por favor, introduza um endereço de correio eletrónico válido", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Pobre", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "Progresso", + "Projects": "Projetos", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "RECUPERAR CONTA", + "REGISTER": "INSCREVA-SE", + "REPORTS": "REPORTS", + "RESET": "REDEFINIR", + "RESET PASSWORD": "REDEFINIR SENHA ", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Liberar APK para a produção", + "Release APK to QA": "Liberar APK para QA", + "Release PWA to Production": "Liberar o AWP para a produção", + "Release PWA to QA": "Liberar PWA para QA", + "Report": "Report", + "Report for": "Report for", + "Reports": "Relatórios", + "Response": "Resposta", + "Restore Backup": "Restore Backup", + "Results": "Resultados", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "VISTA DE PESQUISA", + "START": "INICIAR", + "STOP": "STOP", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "SINCRONIZAR DADOS PARA TODOS OS UTILIZADORES", + "Save": "Guardar", + "Save before switching or your changes will be deleted.": "Guarde antes de mudar ou as suas alterações serão apagadas.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "Escola", + "Score": "Pontuação", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "A pesquisar", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Selecione o nome do formulário", + "Select Report": "Selecionar Relatório", + "Select Student": "Selecione Aluno", + "Select Subtask": "Selecione Subtarefa", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "Selecione um ou mais", + "Select only one": "Selecione apenas um", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "Selecione o seu nome de utilizador", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "Definições", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "Hora de início", + "Status": "Estado", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Aluno", + "Student Dashboard": "Painel do aluno", + "Student Grouping": "Agrupamento de alunos", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Relatório de Sub-teste do aluno", + "Students Assessed": "Alunos Avaliados", + "Students to watch": "Alunos a observar", + "SubTask Report": "Relatório da SubTask", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Sub-tarefa", + "Subtest Name": "Subtest Name", + "Subtest Report": "Relatório de sub-teste", + "Success!": "Success!", + "Summary": "Resumo", + "Support": "Apoio", + "Switch Editor": "Switch Editor", + "Sync": "Tradução: Equipa PT-Subs", + "Sync Successful": "Sync Sucesso", + "Sync Unsuccessful. Please Retry": "Sync sem sucesso. Por favor, tente novamente", + "Syncing Status By User": "Estado de Sincronização por Utilizador", + "Syncing Status Summary": "Resumo do estado de sincronização", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "Toque em todas as caixas que estivessem incorretas durante o teste.", + "Tap items to mark them incorrect.": "Toque nos itens para os marcar incorretamente.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "Tocar no ultimo item tentado", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Relatório de Tarefa", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "A aplicação irá agora verificar a actualização da aplicação e tentar descarregar. Por favor, mantenha-se ligado à Internet durante este processo. Toque em OK para prosseguir.", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "O formulário ainda não está completo. Tem a certeza de que gostaria de sair do formulário?", + "There is unsaved data. Are you sure you would like to exit the form?": "Existem dados não guardados. Tem a certeza de que gostaria de sair do formulário?", + "This Field is Required": "Este Campo é Necessário", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "Dicas", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "Total", + "Total Docs Uploaded": "Total de documentos enviados", + "Total Docs not Uploaded": "Total de documentos não carregados", + "Total Percentage Complete": "Percentagem Total Completa", + "Total Updates Applied": "Total de atualizações aplicadas", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "Tente mover-se para fora com uma visão clara do céu", + "Try standing away from trees or buildings": "Tente ficar longe de árvores ou edifícios", + "Try standing next to a window": "Tente ficar ao lado de uma janela", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "Incapaz de verificar a sua actualização. Certifique-se de que está ligado à Internet e tente novamente.", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "Atualização do App", + "Update is Running. Please Wait ...": "A atualização está em curso. Por favor, aguarde ...", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "Utilizador adicionado ao grupo com sucesso", + "User Created Succesfully": "Utilizador Criado com Sucesso", + "User Removed from Group Successfully": "Utilizador Removido do Grupo com Sucesso", + "Username": "Nome de utilizador", + "Username Available": "Nome de utilizador disponível", + "Username Unavailable": "Nome de utilizador indisponível", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "Ver o seu AWP", + "Visits": "Visitas", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "Escreva falhou", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "Não tem acesso ao recurso.", + "You have not started this event": "Ainda não iniciou este evento", + "You have not started this form": "Ainda não iniciou este formulário", + "You may not mark an item incorrect that is beyond the last item attempted.": "Não se pode marcar um item incorreto que esteja para além do último item tentado.", + "You may proceed.": "Pode prosseguir.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "O seu APK está a construir...", + "Your PWA is building...": "O seu AWP está a construir...", + "accept": "accept", + "and": "and", + "back": "voltar", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "fechar", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "eventos", + "here": "aqui", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "latitude", + "loading": "carregamento", + "longitude": "longitude", + "manifest": "manifesto", + "merged": "merged", + "new case": "novo caso", + "new form": "new form", + "new issue": "new issue", + "next": "próximo", + "no": "no", + "no, stop": "não, parar", + "open": "abrir", + "open cases": "casos abertos", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "resposta", + "result": "resultado", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "exceto", + "scan": "scan", + "searching": "pesquisa", + "see form": "see form", + "start another": "iniciar outro", + "start event": "evento inicial", + "start form": "formulário de início", + "submit": "submeter", + "summary": "resumo", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "sim, continuar", + "✓ Yay! You are up to date.": "✓ Yay! Está atualizado", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." +} \ No newline at end of file diff --git a/translations/translation.ru.json b/translations/translation.ru.json index 90c28e151b..840048b877 100644 --- a/translations/translation.ru.json +++ b/translations/translation.ru.json @@ -13,33 +13,46 @@ "Add New User": "Добавить нового пользователя", "Add Student": "Добавить ученика", "Add User to Group": "Add User to Group", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Возможно обновление. Убедитесь синхронизировать вашу информацию, перед установкой обновления. Если это не сделано, нажмите 'Отмена'. Если готовы к установке обновления, нажмите 'Да'", "Applying Updates...": "Выполняется обновление...", "April": "April", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "Вы уверены, что хотите начать заполнение анкеты?", "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", "August": "August", "Average": "Среднее", "Average Correct": "Средняя правильная", "Average Correct (%)": "Средняя правильная (%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Case", "Cases": "Cases", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "Проверьте обновления", "Checking": "Checking", "Checking For Updates...": "Проверяются обновления...", "Choose a task report from one of the following selections:": "Выберите отчет:", "Choose type...": "Choose type...", "Choose which case type": "Choose which case type", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "Группировка по классам", "Class Size": "Class Size", "Class grouping": "Группировка по классам", + "Classes": "Classes", "Click a Picture": "Нажмите на картинку", "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", "Click the play button to get started.": "Нажмите кнопку 'играть' для начала.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "Нажмите для скачивания", "Close": "Закройте", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -62,7 +75,10 @@ "Creating new case...": "Creating new case...", "Current": "Current", "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", "Date and Time": "Дата и время", "Day": "Day", "Day View": "Day View", @@ -80,9 +96,11 @@ "EXPORT DATA FOR ALL USERS": "ЭКСПОРТИРУЙТЕ ДАННЫЕ ДЛЯ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ", "Edit Item": "Измените элемент", "Email": "Отправьте по эл-почте", + "End Date": "End Date", "Enter your response to above question here": "Введите ваш ответ на вышеупомянутый вопрос сюда", "Error Downloading File": "Ошибка скачивания файла", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "Event", "Export Backup": "Export Backup", "Export Data": "Экспортируйте данные", @@ -105,6 +123,7 @@ "Generating CSV": "Создание CSV", "Geolocation authorized.": "Geolocation authorized.", "Good": "Good", + "Grade": "Grade", "Great": "Great", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "Группа", @@ -141,6 +160,7 @@ "Logout": "Выход", "Longitude": "Длина/ продолжительность", "MARK": "ОТМЕТКА/ ОТМЕТЬТЕ", + "Maintenance": "Maintenance", "Manage Groups": "Управлять группы", "Manage Profile": "Управлять профиль", "Manage Users": "Управлять пользователей", @@ -149,6 +169,8 @@ "Mediocre": "Mediocre", "Meters": "Метр", "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "Мои анкеты", "Name": "ФИО", "New Case": "New Case", @@ -161,7 +183,9 @@ "Next": "Next", "No Data for": "Нет данных о", "No Forms Currently Defined": "Нет форм- определенных в настоящее время", + "No Students currently registered.": "No Students currently registered.", "No Update": "Нет обновлений", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "None", "Notifications authorized.": "Notifications authorized.", @@ -191,6 +215,7 @@ "Permission Denied. Login to Continue": "Отказ разрешения. Войдите для продолжения", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "Выбирайте...", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "Пожалуйста, вводите правильный адрес эл-почты", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "Poor", @@ -215,6 +240,8 @@ "Release APK to QA": "Пустите APK в QA", "Release PWA to Production": "Пустите PWA в производство", "Release PWA to QA": "Пустите PWA в QA", + "Report": "Report", + "Report for": "Report for", "Reports": "Отчеты", "Response": "Ответьте", "Restore Backup": "Restore Backup", @@ -225,6 +252,7 @@ "SEARCH VIEW": "SEARCH VIEW", "START": "НАЧНИТЕ/ НАЧАЛО", "STOP": "ОСТАНОВИТЕСЬ/ ОСТАНОВКА", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "СИНХРОНИЗИРУЙТЕ ДАННЫЕ ДЛЯ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ", "Save": "Сохраните", "Save before switching or your changes will be deleted.": "Сохраните перед переходом/ выключением, или ваши изменения будут потеряны.", @@ -232,7 +260,13 @@ "Scan Code": "Scan Code", "School": "Школа", "Score": "Оценка", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "Search cases", "Searching": "идёт поиск", "Searching...": "Searching...", @@ -241,6 +275,9 @@ "Select Report": "Выберите отчет", "Select Student": "Select Student", "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "Выбирайте одно или более...", "Select only one": "Выбирайте только одно", @@ -249,22 +286,29 @@ "September": "September", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Settings", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Start", + "Start Date": "Start Date", "Start Time": "Время начала", "Status": "Статус", "Status.Concerning": "Status.Concerning", "Status.Good": "Status.Good", "Status.Great": "Status.Great", "Status.Poor": "Status.Poor", + "Stud.": "Stud.", "Student": "Ученик", "Student Dashboard": "Student Dashboard", "Student Grouping": "Группировка учеников", + "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "Промежуточный отчёт", "Students Assessed": "Оценка успеваемости учащихся", "Students to watch": "Студенты", "SubTask Report": "Отчет по подзадаче", + "Subject scores": "Subject scores", "Submit": "Submit", "Submitting...": "Submitting...", "Subtask": "Подзадача", @@ -282,7 +326,9 @@ "Tangerine": "Планшет", "Tap any boxes that were incorrect during the test.": "Коснитесь/ Отметьте все ячейки, которые были неправильны во время теста", "Tap items to mark them incorrect.": "Коснитесь элементов, чтобы отметить их как неправильные", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "Коснитесь эелемента последней вашей попытки", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "Отчет о выполнении задач", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "Программ начнёт проверку обновления и попытается загрузить его. Пожалуйста, оставайтесь в интернете во время этого процесса. Нажмите 'ОК' для продолжения.", @@ -293,8 +339,11 @@ "There is unsaved data. Are you sure you would like to exit the form?": "Имеются несохраненные данные. Вы уверены что хотите покинуть анкету?", "This Field is Required": "Это поле обязательно к заполнению", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "Подсказки", "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "Всего/ общее количество", "Total Docs Uploaded": "Всего загруженных документов", "Total Docs not Uploaded": "Всего незагруженных документов", @@ -307,10 +356,13 @@ "Try standing next to a window": "Попробуйте встать у окна", "Unable to check for update. Make sure you are connected to the Internet and try again.": "Unable to check for update. Make sure you are connected to the Internet and try again.", "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", "Unknown": "Unknown", "Update App": "Обновляйте приложение", "Update is Running. Please Wait ...": "Идет обновление, пожалуйста, подождите...", + "Updating": "Updating", "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "Пользователь успешно добавлен в группу", "User Created Succesfully": "Пользователь успешно создан", "User Removed from Group Successfully": "Пользователь успешно удален из группы", @@ -334,6 +386,7 @@ "You have not started this form": "You have not started this form", "You may not mark an item incorrect that is beyond the last item attempted.": "Вам не нужно пометить элемент, который стоит за элементом последней попытки, как неправильный.", "You may proceed.": "Можете продолжать.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": "Создаётся ваш APK...", "Your PWA is building...": "Создаётся ваш PWA...", "accept": "accept", @@ -356,6 +409,7 @@ "manifest": "manifest", "merged": "merged", "new case": "new case", + "new form": "new form", "new issue": "new issue", "next": "Далее", "no": "no", @@ -365,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "Ответьте", + "result": "result", "review case": "review case", "review form": "review form", "revision": "revision", diff --git a/translations/translation.sw.json b/translations/translation.sw.json index 45327d54fa..3bc9acb898 100644 --- a/translations/translation.sw.json +++ b/translations/translation.sw.json @@ -1,193 +1,441 @@ { - "Unable to check for update. Make sure you are connected to the Internet and try again.":"Imeshindwa kuangalia sasisha (update). Hakikisha umeunganishwa kwenye intaneti na ujaribu tena", - "+ Add User to Group":"Ongeza mtumiaji kwenye kikundi", - "+ Create a New Form":"Unda fomu mpya", - "+ Create a New Group":"Unda kundi jipya", - "+ Create a New User":"Unda Mtumiaji mpya", - "Accuracy":"Usahihi", - "Accuracy Level":"Kiwango cha usahihi", - "Add New User":"Ongeza mtumiaji mpya", - "Add User to Group":"Ongeza mtumiaji kwenye kikundi", - "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"Sasisho linapatikana. Hakikisha kwanza una sawazisha taarifa (data) zako kabla hujasasisha sasisho (installing update). Ikiwa hujafanya hili bonyeza 'FUTA'. Iwapo upo tayari ku sasisha sasisho (installing updates), bonyeza 'NDIO'", - "Applying Updates...":"Kutumia Sasisho", - "Are you sure you want to start a form response?":"Una hakika kuwa unataka kuanza jibu thabiti?", - "There is unsaved data. Are you sure you would like to exit the form?":"Kuna taarifa ambazo hazijahifadhiwa.Je una uhakika kuwa unataka kufunga fomu?", - "The form is not yet complete. Are you sure you would like to exit the form?":"Fomu bado haijakamilika. Je una uhakika kuwa ungependa kufunga fomu?", - "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"Programu kwa sasa itaangalia sasisho la maombi na kujaribu kupakua. Tafadhali endelea kuunganishwa kwenye intaneti wakati wa mchakato huu. Bonyeza 'SAWA' Kuendelea", - "Case":"Kesi", - "Cases":"Kesi", - "Check for Update":"Angalia sasisho", - "Checking For Updates...":"Kuangalia kwa sasisho", - "Choose which case type":"Chagua aina gani ya kesi", - "Click a Picture":"Bonyeza picha", - "Click the play button to get started.":"Bonyeza kitufe cha kucheza ili kuanza", - "Click to Download":"bonyeza kupakua", - "Close":"Funga", - "close":"Funga", - "Confirm New Password":"Thibitisha neno siri mpya", - "Confirm Password":"Thibitisha neno siri", - "Could Not Contact Server.":"Haikuweza kuwasiliana na seva", - "Could Not Create User":"Haikuweza kuunda mtumiaji", - "Could Not Generate APK":"Haikuweza kuanzisha APK", - "Could Not Generate PWA":"Haikuweza kuanzisha PWA", - "Could Not Load List Of Forms":"Haikuweza kupakia orodha ya fomu", - "Complete":"Kamili", - "Create Form":"Unda fomu", - "Date and Time":"Tarehe na Muda", - "Distance from reference":"Umbali kutoka kwa kumbukumbu", - "Docs Not Uploaded":"Hati hazijapakiwa", - "Docs Uploaded":"Hati zimepakiwa", - "Download CSV":"Pakua CSV", - "Download your APK":"Pakua APK yako", - "EXPORT DATA FOR ALL USERS":"Sambaza data (Taarifa) kwa watumiaji wote", - "Edit Item":"Hariri (rekebisha) kipengele", - "Email":"Barua pepe", - "Enter your response to above question here":"Ingiza majibu yako kwa swali hapo juu", - "Error Downloading File":"Kosa kwa upakuaji wa faili", - "Event":"Tukio", - "events":"Matukio", - "Export Data":"Tuma data", - "File Stored At":"File limehifadhiwa kwenye", - "Filter":"chujio", - "First Name":"Jina la kwanza", - "Form":"Fomu bado haijakamilika. Je una uhakika kuwa ungependa kufunga fomu?", - "Form Id":"Kitambulisho cha fomu", - "Form Name":"Jina la fomu", - "Form Title":"Jina la fomu", - "Forms":"Fomu ", - "Generate APK/PWA":"Zalisha APK/PWA", - "Generating CSV":"Zalisha CSV", - "Group":"Kundi", - "Group Created Succesfully":"Kundi limeundwa kwa mafanikio", - "Group Details":"Maelezo ya kikundi", - "Group Name":"Jina la kundi", - "Help":"Msaada", - "Incomplete":"Haijakamilika", - "Item Listing":"Orodha ya vipengele", - "Item Not Found":"Kipengele hakikupatikana", - "Item Title":"Jina la kipengele", - "LAST ATTEMPTED":"Jaribio la mwisho", - "LOGIN":"Ingia", - "Last Name":"Jina la mwisho", - "Last Successful Sync Timestamp":"Muhuri wa mwisho wa usawazishaji uliofanikiwa", - "Last attempted cannot be before an item marked.":"Jaribio la mwisho haliwezi kuwa kabla ya kipengele kilichowekwa alama", - "Latitude":"Latitudo", - "latitude":"Latitudo", - "Loading":"Upakiaji", - "loading":"Upakiaji", - "Login":"Ingia", - "Login Unsuccesful":"kuingia hakukufanikiwa", - "Logout":"Ondoka", - "Longitude":"Longitudo", - "longitude":"Longitudo", - "MARK":"Alama", - "Manage Groups":"Dhibiti kikundi", - "Manage Profile":"Dhibiti maelezo mafupi", - "Manage Users":"Dhibiti watumiaji", - "manifest":"Dhihirisha", - "Meters":"Mita", - "My Forms":"Fomu zangu", - "new case":"Kesi mpya", - "New Form":"Fomu mpya", - "New Group":"Kundi jipya", - "New Item":"Kipengele kipya", - "New Password":"Neno siri jipya", - "No Data for":"Hakuna data kwa", - "No Forms Currently Defined":"Hakuna fomu zilizo fafanuliwa kwa sasa", - "No Update":"Hakuna sasisho", - "Observations":"Uchunguzi", - "Open":"Fungua", - "open":"Fungua", - "Opened":"Kufunguliwa", - "Open a Case":"Fungua kesi", - "open cases":"Fungua kesi", - "Password":"Neno siri", - "Password Reset Unsuccesful":"Kuweka upya neno siri Hakujafanikiwa", - "Passwords do not match":"Neno siri halifanani", - "Percentage Complete":"Asilimia kamili", - "Permission Denied.":"Ruhusa imekataliwa", - "Permission Denied. Login to Continue":"Ruhusa imekataliwa. Ingia ili uendelee", - "Pick a":"Chagua ", - "Please enter a valid email address":"Tafadhali ingiza barua pepe halali", - "Progress":"Maendeleo", - "Projects":"Miradi", - "RECOVER ACCOUNT":"Rejesha akaunti", - "REGISTER":"Andikisha", - "RESET":"Weka upya", - "RESET PASSWORD":"Weka upya Neno siri", - "Release APK to Production":"Toa APK Kwenye uzalishaji", - "Release APK to QA":"Toa APK kwenye QA", - "Release PWA to Production":"Toa APK Kwenye uzalishaji", - "Release PWA to QA":"Toa APK kwenye QA", - "Reports":"Taarifa", - "Response":"Majibu", - "response":"Majibu", - "START":"Anza", - "STOP":"Simama", - "SYNC DATA FOR ALL USERS":"Usawazishaji wa data kwa watumiaji wote", - "Save":"Hifadhi", - "save":"Hifadhi", - "Save before switching or your changes will be deleted.":"Hifadhi kabla ya kubadili la sivyo mabadiliko yako yatafutwa", - "School":"Shule", - "Searching":"Kutafuta", - "searching":"Kutafuta", - "Select Form Name":"Chagua kutoka kwa jina", - "Select one or more":"Chagua moja au zaidi", - "Select only one":"Chagua moja au zaidi", - "Select your Username":"Chagua jina lako la mtumiaji", - "Settings":"Mipangilio", - "start another":"Anza nyingine", - "start event":"Anza tukio", - "start form":"Anza fomu", - "Start Time":"Muda wa kuanza", - "Status":"Hali", - "submit":"Wasilisha", - "Summary":"Muhtasari", - "summary":"Muhtasari", - "Support":"Msaada", - "Switch Editor":"Badilisha mhariri", - "Sync":"Usawazishaji", - "Sync Successful":"Usawazishaji umefanikiwa", - "Sync Unsuccessful. Please Retry":"Usawazishaji haukufanikiwa. Tafadhali jaribu tena", - "Syncing Status By User":"Hali ya usawazishaji kwa mtumiaji", - "Syncing Status Summary":"Muhtasari wa hali ya usawazishaji", - "Tangerine":"Tanjerini", - "Tap any boxes that were incorrect during the test.":"Gusa kisanduku chochote ambacho hakikuwa sahihi wakati wa jaribio", - "Tap items to mark them incorrect.":"Gusa vipengele kuonesha alama isiyo sahihi", - "Tap the item last attempted.":"Gusa kipengele kilichojaribiwa mara ya mwisho", - "This Field is Required":"Kipengele hiki kinahitajika", - "Tips":"Dondoo", - "Total":"Jumla", - "Total Docs Uploaded":"Taarifa zote zimepakiwa", - "Total Docs not Uploaded":"Taarifa zote hazijapakiwa", - "Total Percentage Complete":"Asilimia kamili imekamilika", - "Total Updates Applied":"Sasisho kamili limetumika", - "Try moving outside with a clear view of the sky":"Jaribu kuhamia nje na mtazamo wazi wa anga", - "Try standing away from trees or buildings":"Jaribu kusimama mbali kutoka kwenye miti au majengo", - "Try standing next to a window":"Jaribu kusimama pembezoni mwa dirisha", - "Update App":"Sasisha programu", - "Update is Running. Please Wait ...":"Sasisho linaendelea. Tafadhali subiri", - "User Added to Group Successfully":"Mtumiaji ameongezwa kwa ufanisi", - "User Created Succesfully":"Mtumiaji ameundwa kwa ufanisi", - "User Removed from Group Successfully":"Mtumiaji ameondolewa kwenye kundi kwa ufanisi", - "Username":"Jina la mtumiaji", - "Username Available":"Jina la mtumiaji linapatikana", - "Username Unavailable":"Jina la mtumiaji halipatikani", - "View your PWA":"Tazama PWA Yako", - "Visits":"ziara", - "Write Failed":"Uandishi umeshindikana", - "You do not have access to the resource.":"Huna ufikiaji wa rasilimali", - "You have not started this event":"Hujaanzisha tukio hili", - "You have not started this form":"Hujaanzisha fomu hii", - "You may not mark an item incorrect that is beyond the last item attempted.":"Huwezi kutia alama kitu kisicho sahihi ambacho ni zaidi ya jaribio la mwisho", - "You may proceed.":"Unaweza kuendelea", - "Your APK is building...":"APK Yako inajengwa", - "Your PWA is building...":"PWA yako inajengwa", - "here":"Hapa", - "✓ Yay! You are up to date.":"Ndio! Umesasisha", - "yes, continue":"Ndio, Endelea", - "no, stop":"Hapana, Simama", - "SEARCH VIEW":"Mtazamo wa utafutaji", - "next":"Inayofuata", - "back":"Nyuma" + "% Correct": "% Correct", + "+ Add User to Group": "Ongeza mtumiaji kwenye kikundi", + "+ Create a New Form": "Unda fomu mpya", + "+ Create a New Group": "Unda kundi jipya", + "+ Create a New User": "Unda Mtumiaji mpya", + "About": "About", + "Accuracy": "Usahihi", + "Accuracy Level": "Kiwango cha usahihi", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Add Class", + "Add New User": "Ongeza mtumiaji mpya", + "Add Student": "Add Student", + "Add User to Group": "Ongeza mtumiaji kwenye kikundi", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Sasisho linapatikana. Hakikisha kwanza una sawazisha taarifa (data) zako kabla hujasasisha sasisho (installing update). Ikiwa hujafanya hili bonyeza 'FUTA'. Iwapo upo tayari ku sasisha sasisho (installing updates), bonyeza 'NDIO'", + "Applying Updates...": "Kutumia Sasisho", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "Una hakika kuwa unataka kuanza jibu thabiti?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Average", + "Average Correct": "Average Correct", + "Average Correct (%)": "Average Correct (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "Kesi", + "Cases": "Kesi", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "Angalia sasisho", + "Checking": "Checking", + "Checking For Updates...": "Kuangalia kwa sasisho", + "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", + "Choose type...": "Choose type...", + "Choose which case type": "Chagua aina gani ya kesi", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Class grouping", + "Classes": "Classes", + "Click a Picture": "Bonyeza picha", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "Bonyeza kitufe cha kucheza ili kuanza", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "bonyeza kupakua", + "Close": "Funga", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "Kamili", + "Completed?": "Completed?", + "Concerning": "Concerning", + "Confirm New Password": "Thibitisha neno siri mpya", + "Confirm Password": "Thibitisha neno siri", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "Haikuweza kuwasiliana na seva", + "Could Not Create User": "Haikuweza kuunda mtumiaji", + "Could Not Generate APK": "Haikuweza kuanzisha APK", + "Could Not Generate PWA": "Haikuweza kuanzisha PWA", + "Could Not Load List Of Forms": "Haikuweza kupakia orodha ya fomu", + "Create": "Create", + "Create Form": "Unda fomu", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "Tarehe na Muda", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Umbali kutoka kwa kumbukumbu", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "Hati hazijapakiwa", + "Docs Uploaded": "Hati zimepakiwa", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Pakua CSV", + "Download your APK": "Pakua APK yako", + "EXPORT DATA FOR ALL USERS": "Sambaza data (Taarifa) kwa watumiaji wote", + "Edit Item": "Hariri (rekebisha) kipengele", + "Email": "Barua pepe", + "End Date": "End Date", + "Enter your response to above question here": "Ingiza majibu yako kwa swali hapo juu", + "Error Downloading File": "Kosa kwa upakuaji wa faili", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "Tukio", + "Export Backup": "Export Backup", + "Export Data": "Tuma data", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "File limehifadhiwa kwenye", + "File restored from ": "File restored from ", + "Filter": "chujio", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "Jina la kwanza", + "Form": "Fomu bado haijakamilika. Je una uhakika kuwa ungependa kufunga fomu?", + "Form Id": "Kitambulisho cha fomu", + "Form Name": "Jina la fomu", + "Form Title": "Jina la fomu", + "Forms": "Fomu ", + "Generate APK/PWA": "Zalisha APK/PWA", + "Generating CSV": "Zalisha CSV", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Good", + "Grade": "Grade", + "Great": "Great", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Kundi", + "Group Created Succesfully": "Kundi limeundwa kwa mafanikio", + "Group Details": "Maelezo ya kikundi", + "Group Name": "Jina la kundi", + "Grouping Report": "Grouping Report", + "Help": "Msaada", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "Haijakamilika", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "Orodha ya vipengele", + "Item Not Found": "Kipengele hakikupatikana", + "Item Title": "Jina la kipengele", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "Jaribio la mwisho", + "LOGIN": "Ingia", + "Last Name": "Jina la mwisho", + "Last Successful Sync Timestamp": "Muhuri wa mwisho wa usawazishaji uliofanikiwa", + "Last attempted cannot be before an item marked.": "Jaribio la mwisho haliwezi kuwa kabla ya kipengele kilichowekwa alama", + "Latitude": "Latitudo", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "Upakiaji", + "Location": "Location", + "Login": "Ingia", + "Login Unsuccesful": "kuingia hakukufanikiwa", + "Logout": "Ondoka", + "Longitude": "Longitudo", + "MARK": "Alama", + "Maintenance": "Maintenance", + "Manage Groups": "Dhibiti kikundi", + "Manage Profile": "Dhibiti maelezo mafupi", + "Manage Users": "Dhibiti watumiaji", + "March": "March", + "May": "May", + "Mediocre": "Mediocre", + "Meters": "Mita", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "Fomu zangu", + "Name": "Name", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "Fomu mpya", + "New Group": "Kundi jipya", + "New Item": "Kipengele kipya", + "New Password": "Neno siri jipya", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "Hakuna data kwa", + "No Forms Currently Defined": "Hakuna fomu zilizo fafanuliwa kwa sasa", + "No Students currently registered.": "No Students currently registered.", + "No Update": "Hakuna sasisho", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "Uchunguzi", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Fungua", + "Open a Case": "Fungua kesi", + "Opened": "Kufunguliwa", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "Neno siri", + "Password Reset Unsuccesful": "Kuweka upya neno siri Hakujafanikiwa", + "Password is required": "Password is required", + "Passwords do not match": "Neno siri halifanani", + "Percentage Complete": "Asilimia kamili", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentile", + "Permission Denied.": "Ruhusa imekataliwa", + "Permission Denied. Login to Continue": "Ruhusa imekataliwa. Ingia ili uendelee", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "Chagua ", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "Tafadhali ingiza barua pepe halali", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Poor", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "Maendeleo", + "Projects": "Miradi", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "Rejesha akaunti", + "REGISTER": "Andikisha", + "REPORTS": "REPORTS", + "RESET": "Weka upya", + "RESET PASSWORD": "Weka upya Neno siri", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Toa APK Kwenye uzalishaji", + "Release APK to QA": "Toa APK kwenye QA", + "Release PWA to Production": "Toa APK Kwenye uzalishaji", + "Release PWA to QA": "Toa APK kwenye QA", + "Report": "Report", + "Report for": "Report for", + "Reports": "Taarifa", + "Response": "Majibu", + "Restore Backup": "Restore Backup", + "Results": "Results", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "Mtazamo wa utafutaji", + "START": "Anza", + "STOP": "Simama", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "Usawazishaji wa data kwa watumiaji wote", + "Save": "Hifadhi", + "Save before switching or your changes will be deleted.": "Hifadhi kabla ya kubadili la sivyo mabadiliko yako yatafutwa", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "Shule", + "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "Kutafuta", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Chagua kutoka kwa jina", + "Select Report": "Select Report", + "Select Student": "Select Student", + "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "Chagua moja au zaidi", + "Select only one": "Chagua moja au zaidi", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "Chagua jina lako la mtumiaji", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "Mipangilio", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "Muda wa kuanza", + "Status": "Hali", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Student", + "Student Dashboard": "Student Dashboard", + "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Student Subtest Report", + "Students Assessed": "Students Assessed", + "Students to watch": "Students to watch", + "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Subtask", + "Subtest Name": "Subtest Name", + "Subtest Report": "Subtest Report", + "Success!": "Success!", + "Summary": "Muhtasari", + "Support": "Msaada", + "Switch Editor": "Badilisha mhariri", + "Sync": "Usawazishaji", + "Sync Successful": "Usawazishaji umefanikiwa", + "Sync Unsuccessful. Please Retry": "Usawazishaji haukufanikiwa. Tafadhali jaribu tena", + "Syncing Status By User": "Hali ya usawazishaji kwa mtumiaji", + "Syncing Status Summary": "Muhtasari wa hali ya usawazishaji", + "Tangerine": "Tanjerini", + "Tap any boxes that were incorrect during the test.": "Gusa kisanduku chochote ambacho hakikuwa sahihi wakati wa jaribio", + "Tap items to mark them incorrect.": "Gusa vipengele kuonesha alama isiyo sahihi", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "Gusa kipengele kilichojaribiwa mara ya mwisho", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Task Report", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "Programu kwa sasa itaangalia sasisho la maombi na kujaribu kupakua. Tafadhali endelea kuunganishwa kwenye intaneti wakati wa mchakato huu. Bonyeza 'SAWA' Kuendelea", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "Fomu bado haijakamilika. Je una uhakika kuwa ungependa kufunga fomu?", + "There is unsaved data. Are you sure you would like to exit the form?": "Kuna taarifa ambazo hazijahifadhiwa.Je una uhakika kuwa unataka kufunga fomu?", + "This Field is Required": "Kipengele hiki kinahitajika", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "Dondoo", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "Jumla", + "Total Docs Uploaded": "Taarifa zote zimepakiwa", + "Total Docs not Uploaded": "Taarifa zote hazijapakiwa", + "Total Percentage Complete": "Asilimia kamili imekamilika", + "Total Updates Applied": "Sasisho kamili limetumika", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "Jaribu kuhamia nje na mtazamo wazi wa anga", + "Try standing away from trees or buildings": "Jaribu kusimama mbali kutoka kwenye miti au majengo", + "Try standing next to a window": "Jaribu kusimama pembezoni mwa dirisha", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "Imeshindwa kuangalia sasisha (update). Hakikisha umeunganishwa kwenye intaneti na ujaribu tena", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "Sasisha programu", + "Update is Running. Please Wait ...": "Sasisho linaendelea. Tafadhali subiri", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "Mtumiaji ameongezwa kwa ufanisi", + "User Created Succesfully": "Mtumiaji ameundwa kwa ufanisi", + "User Removed from Group Successfully": "Mtumiaji ameondolewa kwenye kundi kwa ufanisi", + "Username": "Jina la mtumiaji", + "Username Available": "Jina la mtumiaji linapatikana", + "Username Unavailable": "Jina la mtumiaji halipatikani", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "Tazama PWA Yako", + "Visits": "ziara", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "Uandishi umeshindikana", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "Huna ufikiaji wa rasilimali", + "You have not started this event": "Hujaanzisha tukio hili", + "You have not started this form": "Hujaanzisha fomu hii", + "You may not mark an item incorrect that is beyond the last item attempted.": "Huwezi kutia alama kitu kisicho sahihi ambacho ni zaidi ya jaribio la mwisho", + "You may proceed.": "Unaweza kuendelea", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "APK Yako inajengwa", + "Your PWA is building...": "PWA yako inajengwa", + "accept": "accept", + "and": "and", + "back": "Nyuma", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "Funga", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "Matukio", + "here": "Hapa", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "Latitudo", + "loading": "Upakiaji", + "longitude": "Longitudo", + "manifest": "Dhihirisha", + "merged": "merged", + "new case": "Kesi mpya", + "new form": "new form", + "new issue": "new issue", + "next": "Inayofuata", + "no": "no", + "no, stop": "Hapana, Simama", + "open": "Fungua", + "open cases": "Fungua kesi", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "Majibu", + "result": "result", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "Hifadhi", + "scan": "scan", + "searching": "Kutafuta", + "see form": "see form", + "start another": "Anza nyingine", + "start event": "Anza tukio", + "start form": "Anza fomu", + "submit": "Wasilisha", + "summary": "Muhtasari", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "Ndio, Endelea", + "✓ Yay! You are up to date.": "Ndio! Umesasisha", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." } \ No newline at end of file diff --git a/translations/translation.tg.json b/translations/translation.tg.json index 8d4031d294..cfc764bcfe 100644 --- a/translations/translation.tg.json +++ b/translations/translation.tg.json @@ -13,33 +13,46 @@ "Add New User": "Илова кардани корбари нав", "Add Student": "Add Student", "Add User to Group": "Ба гурӯҳ ҳамроҳ намудани корбар", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Таҷдид мумкин аст. Қабл аз сабт кардани функсияҳои нав маълумоти худро ҳамгомсозӣ кунед. Агар чунин накарда бошед, калимаи `Лағв`-ро зер кунед. Агар барои насб кардани навгониҳо омода ҳастед, калимаи `Ҳа`-ро зер кунед.", "Applying Updates...": "Система таҷдид шуда истодааст ", "April": "April", "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", "Are you sure you want to start a form response?": "Дар ҳақиқат шумо пур кардани варақаро оғоз карданиед?", "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", "August": "August", "Average": "Average", "Average Correct": "Average Correct", "Average Correct (%)": "Average Correct (%)", + "Back": "Back", "Backup directory": "Backup directory", "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", "Camera authorized.": "Camera authorized.", "Case": "Парванда", "Cases": "Парвандаҳо", + "Change Class": "Change Class", + "Change Subject": "Change Subject", "Check for Update": "Таҷдидро санҷед", "Checking": "Checking", "Checking For Updates...": "Санҷиши таҷдид рафта истодааст.", "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", "Choose type...": "Choose type...", "Choose which case type": "Кадом намуди парвандаро интихоб кунед", + "Class": "Class", + "Class Configuration": "Class Configuration", "Class Grouping": "Class Grouping", "Class Size": "Class Size", "Class grouping": "Class grouping", + "Classes": "Classes", "Click a Picture": "Аксеро (расмеро) пахш кунед. ", "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", "Click the play button to get started.": "Барои сар кардан тугмаи 'старт'-ро зер кунед. ", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", "Click to Download": "Барои боргирӣ кардан инро зер кунед.", "Close": "Махкам кардан", "Close the application completely and re-open.": "Close the application completely and re-open.", @@ -62,7 +75,10 @@ "Creating new case...": "Creating new case...", "Current": "Current", "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", "Date and Time": "Таърихи рӯз ва вақт", "Day": "Day", "Day View": "Day View", @@ -80,9 +96,11 @@ "EXPORT DATA FOR ALL USERS": " ҲАМАИ МАЪЛУМОТРО БА КОРБАРОН РАВОН КУНЕД", "Edit Item": "Элементро таҳрир кунед", "Email": "Бо почтаи электронӣ фиристед. ", + "End Date": "End Date", "Enter your response to above question here": "Ҷавоби саволи дар боло зикршударо ба ин ҷо ворид кунед. ", "Error Downloading File": "Дар гирифтани файл ғалат шуд", "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", "Event": "Event", "Export Backup": "Export Backup", "Export Data": "Маълумотро равон кунед", @@ -105,6 +123,7 @@ "Generating CSV": "CSV таъсис дода шуда истодааст.", "Geolocation authorized.": "Geolocation authorized.", "Good": "Good", + "Grade": "Grade", "Great": "Great", "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", "Group": "Гурӯҳ", @@ -141,6 +160,7 @@ "Logout": "Баромад", "Longitude": "Дарозӣ / амудӣ", "MARK": "ҚАЙД КАРДАН", + "Maintenance": "Maintenance", "Manage Groups": "Идора кардани гурӯҳҳо", "Manage Profile": "Идора кардани саҳифа", "Manage Users": "Идора кардани корбарон", @@ -149,6 +169,8 @@ "Mediocre": "Mediocre", "Meters": "Метр", "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", "My Forms": "Варақаҳои ман", "Name": "Name", "New Case": "New Case", @@ -161,7 +183,9 @@ "Next": "Next", "No Data for": "Маълумот нест", "No Forms Currently Defined": "Айни замон варақа муайян нашудааст", + "No Students currently registered.": "No Students currently registered.", "No Update": "Таҷдид нест", + "No absences recorded in the past month.": "No absences recorded in the past month.", "No changes proposed yet.": "No changes proposed yet.", "None": "None", "Notifications authorized.": "Notifications authorized.", @@ -191,6 +215,7 @@ "Permission Denied. Login to Continue": "Иҷозат нест. Барои идома додан ворид шавед", "Persistent storage authorized.": "Persistent storage authorized.", "Pick a": "Интихоб кунед", + "Please choose your language": "Please choose your language", "Please enter a valid email address": "Лутфан, нишонаи почтаи электронии амалкунандаро ворид намоед", "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", "Poor": "Poor", @@ -215,6 +240,8 @@ "Release APK to QA": "АРК-ро ба QA иҷозат диҳед", "Release PWA to Production": "PWA-ро ба кор иҷозат диҳед", "Release PWA to QA": "РWA-ро ба QA иҷозат диҳед", + "Report": "Report", + "Report for": "Report for", "Reports": "Ҳисоботҳо", "Response": "Ҷавоб ", "Restore Backup": "Restore Backup", @@ -225,6 +252,7 @@ "SEARCH VIEW": "НАЗАРИ Ҷустуҷӯ", "START": "САР КУНЕД", "STOP": "ИСТЕД", + "SUBMIT": "SUBMIT", "SYNC DATA FOR ALL USERS": "МАЪЛУМОТРО БАРОИ ҲАМА КОРБАРОН ҲАМГОМ СОЗЕД", "Save": "Ҳифз кунед", "Save before switching or your changes will be deleted.": "Пеш аз гузариш ҳифз кунед, вагарна тағйироти воридкардаатон нест мешавад.", @@ -232,7 +260,13 @@ "Scan Code": "Scan Code", "School": "Муассиса(и)", "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", "Search cases": "Search cases", "Searching": "Ҷустуҷӯ идома дорад", "Searching...": "Searching...", @@ -241,6 +275,9 @@ "Select Report": "Select Report", "Select Student": "Select Student", "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", "Select case type": "Select case type", "Select one or more": "Як ё зиёдаро интихоб кунед", "Select only one": "Танҳо якторо интихоб кунед", @@ -249,22 +286,29 @@ "September": "September", "Set a password to administer your device": "Set a password to administer your device", "Settings": "Танзимот", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", "Something went wrong, please try again.": "Something went wrong, please try again.", "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", "Start": "Start", + "Start Date": "Start Date", "Start Time": "Вақти оғоз", "Status": "Статус", "Status.Concerning": "Status.Concerning", "Status.Good": "Status.Good", "Status.Great": "Status.Great", "Status.Poor": "Status.Poor", + "Stud.": "Stud.", "Student": "Student", "Student Dashboard": "Student Dashboard", "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", "Student Subtest Report": "Student Subtest Report", "Students Assessed": "Students Assessed", "Students to watch": "Students to watch", "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", "Submit": "Submit", "Submitting...": "Submitting...", "Subtask": "Subtask", @@ -282,7 +326,9 @@ "Tangerine": "ПланшетБарномаи Танҷерин", "Tap any boxes that were incorrect during the test.": "Унсурҳоеро қайд кунед, ки ҳангоми санҷиш нодуруст хондашудаанд", "Tap items to mark them incorrect.": "Ба унсурҳое, ки ҳамчун нодуруст нишон додан зарур аст, ангушт занед.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", "Tap the item last attempted.": "Ба унсуре, ки охирин кӯшиши хонанда буд, ангушт занед.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", "Task Report": "Task Report", "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "Барнома ба санҷидани таҷдид сар карда, кушиши насб кардани онро дорад. Лутфан, интернетро дар ин раванд қатъ накунед. Барои давом додан `ОК`-ро пахш кунед. ", @@ -293,8 +339,11 @@ "There is unsaved data. Are you sure you would like to exit the form?": "Маълумоти ҳифзнашуда мавҷуд аст. Шумо дар ҳақиқат аз ин варақа баромаданиед?", "This Field is Required": "Пур кардани ин бахш ҳатмист ", "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", "Tips": "Нукот/маслиҳат", "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", "Total": "Чамъ", "Total Docs Uploaded": "Ҷамъи санадҳои ирсолшуда", "Total Docs not Uploaded": "Ҷамъи санадҳои ирсолнашуда", @@ -307,10 +356,13 @@ "Try standing next to a window": "Кӯшиш кунед, ки дар шафати тиреза истед.", "Unable to check for update. Make sure you are connected to the Internet and try again.": "Тафтиши навсозиҳо ғайриимкон аст. Лутфан ба интернет пайваст будани худро санҷед ва дубора кӯшиш кунед.", "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", "Unknown": "Unknown", "Update App": "Барномаро таҷдид кунед", "Update is Running. Please Wait ...": "Таҷдид рафта истодааст. Лутфан мунтазир шавед.", + "Updating": "Updating", "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", "User Added to Group Successfully": "Корбар бомуваффақият ба гурӯҳ ҳамроҳ карда шуд.", "User Created Succesfully": "Корбари нав бомуваффият таъсис дода шуд.", "User Removed from Group Successfully": "Корбар бомуваффият аз гурӯҳ хориҷ карда шуд.", @@ -334,6 +386,7 @@ "You have not started this form": "You have not started this form", "You may not mark an item incorrect that is beyond the last item attempted.": "Агар опсияи “унсури охирон хондашуда” фаъол бошад, он гоҳ унсурҳоро ҳамчун унсури нодуруст қайд кардан мумкин нест.", "You may proceed.": "Шумо метавонед идома диҳед", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", "Your APK is building...": "АРК-и шумо таҳия шуда истодааст.", "Your PWA is building...": "РWA-и шумо таҳия шуда истодааст.", "accept": "accept", @@ -356,6 +409,7 @@ "manifest": "manifest", "merged": "merged", "new case": "парвандаи нав", + "new form": "new form", "new issue": "new issue", "next": "Ба пеш", "no": "no", @@ -365,6 +419,7 @@ "opened": "opened", "proposed changes merged": "proposed changes merged", "response": "Ҷавоб ", + "result": "result", "review case": "review case", "review form": "review form", "revision": "revision", diff --git a/translations/translation.ur.json b/translations/translation.ur.json index b9aba724cd..bc6230cc55 100644 --- a/translations/translation.ur.json +++ b/translations/translation.ur.json @@ -1,131 +1,441 @@ { - "Unable to check for update. Make sure you are connected to the Internet and try again.":"اپ ڈیٹس کی چیکنگ( جانچ پڑتال )کرتے ہوئےخرابی کا پیغام ", - "+ Add User to Group":"صارفین کے کی فہرست میں ایک صارف کا اضافہ کریں", - "+ Create a New Form":"گروپ میں ایک نیا فارم بنائیں", - "+ Create a New Group":"ٹینجارائن میں ایک نیا گروپ بنائیں", - "+ Create a New User":"ایک نیا ٹینجارائن یوزر بنائیں جسے گروپ میں شامل کیا جا سکتا ہو", - "Accuracy":"جی پی ایس ریڈنگ کی درستگی", - "Accuracy Level":"جی پی ایس ریڈنگ کی درستگی", - "Add New User":"نئے صارف کا اضافہ کریں", - "Add User to Group":" گروپ میں ایک نئےصارف کا اضافہ کریں", - "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"اپ ڈیٹ شامل کرنے سے قبل اس کا تصدیقی پیغام", - "Applying Updates...":"کسی اپ ڈیٹ کا اطلاق کرتے ہوئے ", - "Are you sure you want to start a form response?":"ایک نیا فارم شروع کرتے ہوئے", - "There is unsaved data. Are you sure you would like to exit the form?":"کوئی فارم چھوڑتے ہوئے تصدیق کرنا کیوں کہ ڈیٹا محفوظ نہیں کیا گیا ہے", - "The form is not yet complete. Are you sure you would like to exit the form?":"کوئی فارم چھوڑتے ہوئے تصدیق کرنا کیوں کہ ڈیٹا محفوظ نہیں کیا گیا ہے", - "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"ہدایات کہ ایپ اپ ڈیٹ کو چیک کرےگی", - "Case":"کیس کا فولڈر جس میں تمام فارم رکھے گئے ہیں", - "Check for Update":"ایپ کی اپ ڈیٹس کو چیک کرنے کا لنک", - "Checking For Updates...":"اپ ڈیٹس کو چیک کرتے وقت کاپیغام", - "Choose which case type":"جب کام شروع کریں تو صحیح کیس کے اقسام کو منتخب کریں ", - "Click a Picture":"اسکرین پر آنےوالی تصویر پر کلک کریں", - "Click the play button to get started.":"فریم ورک پر کام شروع کرنے کے لیے پلے بٹن دبائیں ", - "Click to Download":"CSV فائل ڈاؤن لوڈ کرنے کے لئے یہاں بٹن دبائیں", - "Close":"فل اسکرین موڈ کو بند کر دیں", - "Confirm New Password":"پاس ورڈ کو تبدیل کرتے ہوئے نئے پاس ورڈ کی تصدیق کریں", - "Confirm Password":"اسکرین پر پاس ورڈ کی تصدیق کریں", - "Could Not Contact Server.":"نتائج کو سنک کرتے وقت کا مسئلہ/ خرابی", - "Could Not Create User":"صارف بناتے وقت کا مسئلہ /خرابی", - "Could Not Generate APK":"APK کی تیاری کے دوران مسئلہ /خرابی", - "Could Not Generate PWA":"ویپ براوزر ایپ /پورٹل ڈسپلے پروگرام کی تیاری کے دوران مسئلہ /خرابی", - "Could Not Load List Of Forms":"فارم کے صفحہ کی فہرست پر مسئلہ /خرابی", - "Complete":"فارم کی مکمل درجہ بندی ", - "Create Form":"نیا فارم بنائیں", - "Docs Not Uploaded":"نتائج کو سرور پرمنتقل نہیں کیا گیا ", - "Docs Uploaded":"نتائج کو سرور پرمنتقل کیا گیا ", - "Download CSV":"فارم کے لیے سی ایس وی فائل ڈاون لوڈ کریں", - "Download your APK":" اے پی کے فائل ڈاون لوڈ کریں", - "EXPORT DATA FOR ALL USERS":"ٹیبلیٹ پر موجود معلومات کو تمام صارفین کے لیے ایکسپورٹ کریں/بھیجے", - "Edit Item":"صفحہ پر موجودہ شے کو درست کریں ", - "Email":" ان پٹ ٹائپ کو ای میل کریں", - "Enter your response to above question here":"مطلوبہ معیاری پیغام کے سوالات پوچھیں کہ وہ مکمل ہوچکے ہیں", - "Error Downloading File":"", - "Event":"کسی کیس کی کیفیت ", - - "Export Data":"ٹیبلیٹ سے ڈیٹا ایکسپورٹ کرنے کا لنک", - "File Stored At":"وہ جگہ جہاں ایکسپورٹ فائل رکھی کی جاتی ہے", - - "Form":"فارم", - "Form Id":"فارم آئی ڈی ", - - "Generate APK/PWA":"اے پی کے لنک بنائیں", - "Generating CSV":"سی ایس وی فائل بناتے وقت پیغام کی درجہ بندی", - "Group":"سرور پر گروپ بنائیں", - "Group Created Succesfully":"گروپ بنانے کے بعد کا پیغام ", - - "LAST ATTEMPTED":"فریم ورک پر آخری کیاگیا کام/فہرست پر آخری کیاگیا کام", - - "Last Successful Sync Timestamp":"آخری بار جب ٹیبلٹ سنک کیا گیا", - "Last attempted cannot be before an item marked.":"گرڈ پر نشان زد کیےآخری آئٹم کے لیے ایرر میسج( خرابی کا پیغام) کسی نا درست آئٹم سےپہلے نہیں ہوسکتا ", - "Latitude":"جی پی ایس ریڈنگ کا پھیلاو", - "latitude":"جی پی ایس ریڈنگ کا پھیلاو", - "Loading":"میسج لوڈ ہو رہا ہے", - - "Longitude":"جی پی ایس ریڈنگ کی لمبائی", - "longitude":"جی پی ایس ریڈنگ کی لمبائی", - - "Meters":"جی پی ایس درستگی کے لیے میٹر", - "My Forms":"ٹیبلیٹ پر مائی فارمز کا لنک", - "new case":"نئے کیس کا لنک", - - "No Data for":"کسی فارم کے لیے ڈیٹا کی عدم موجودگی کا ایرر(یا خرابی)", - "No Forms Currently Defined":"", - "No Update":"کوئی اپ ڈیٹ نہ ہونےکی صورت میں میسج کا اسٹیٹس", - "Observations":"جانچ پڑتال /مشاہدہ کا لنک", - - "Percentage Complete":"صفحہ کی درجہ بندی کو سنک کریں", - - "Pick a":"لوکیشن لسٹ میں آئٹم جو ایک لیول سے پہلے شامل کیا گیا ہے", - "Please enter a valid email address":"ای میل ایڈریس کے لیے ایرر میسج(غلطی کا پیغام)", - - "Release APK to Production":"نئی پروڈکشن اے پی کے شائع کریں ", - "Release APK to QA":"نئی ٹیسٹنگ اے پی کے شائع کریں ", - "Release PWA to Production":"نئی پروڈکشن پی ڈبلیو اے شائع کریں ", - "Release PWA to QA":"نئی ٹیسٹنگ پی ڈبلیو اے شائع کریں ", - "Reports":"ٹیبلیٹ پر رپورٹس کے لنک", - - "START":"گرڈز پر اسٹارٹ کا بٹن", - "STOP":"گرڈز پر اسٹاپ کا بٹن", - "SYNC DATA FOR ALL USERS":"تمام صارفین کےلیے معلومات کو منظم/درست کریں ", - "Save":"ترتیب کو محفوظ کریں ", - - "Select one or more":"ڈیفالٹ چیک باکس گروپ میسج", - "Select only one":"ڈیفالٹ ریڈیو بٹن گروپ میسج", - - "submit":"فارم جمع کرائیں", - "Summary":"خلاصہ ", - - "Sync":"سنک پیج ", - - "Sync Unsuccessful. Please Retry":" مطابقت داری /تواقت میں خرابی کا پیغام", - - "Tap any boxes that were incorrect during the test.":"اِن کریکٹ(نادرست) آئٹمز کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", - "Tap items to mark them incorrect.":"اِن کریکٹ(نادرست )آئٹمز کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", - "Tap the item last attempted.":"لاسٹ(آخری) آئٹم کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", - - "Tips":"جی پی ایس کے لیے ٹِپز( اشاراتی)میسج", - - "Try moving outside with a clear view of the sky":"جی پی ایس ہیلپ ٹیکسٹ", - "Try standing away from trees or buildings":"جی پی ایس ہیلپ ٹیکسٹ", - "Try standing next to a window":"جی پی ایس ہیلپ ٹیکسٹ", - - "Update is Running. Please Wait ...":"کچھ اپ ڈیٹ کرتے ہوئے اسٹیٹس", - "User Added to Group Successfully":"ٹینجارائن گروپ میں صارف کو شامل کیا گیا", - "User Created Succesfully":"صارف کامیابی سے بن گیا ", - "User Removed from Group Successfully":"یوزر(صارف)کو گروپ سے نکال دیا گیا", - - "Username Available":" صارف کے اندراج کے لیے صارف کا نام موجود ہے ", - "Username Unavailable":"صارف کا نام اس اندراج کے لیے موجود نہیں ہے ", - - "Visits":"ٹیبلیٹ پر لنک", - - "Your APK is building...":"اے پی کے بلڈنگ کا اسٹیٹس میسج", - "Your PWA is building...":"ویپ براوزر بلڈنگ کا اسٹیٹس میسج", - - "✓ Yay! You are up to date.":"کامیاب اپ ڈیٹ کے بعد", - "yes, continue":"ہاں ،رضامندی کے لیے تیار ہے ", - "no, stop":"رضامندی کے لیے کوئی جواب نہیں ", - - "next":"اگلے صفحہ پر جانے کے لیے بٹن دبائیں", - "back":"پچھلے صفحہ پر جانے کے لیے بٹن دبائیں" - } \ No newline at end of file + "% Correct": "% Correct", + "+ Add User to Group": "صارفین کے کی فہرست میں ایک صارف کا اضافہ کریں", + "+ Create a New Form": "گروپ میں ایک نیا فارم بنائیں", + "+ Create a New Group": "ٹینجارائن میں ایک نیا گروپ بنائیں", + "+ Create a New User": "ایک نیا ٹینجارائن یوزر بنائیں جسے گروپ میں شامل کیا جا سکتا ہو", + "About": "About", + "Accuracy": "جی پی ایس ریڈنگ کی درستگی", + "Accuracy Level": "جی پی ایس ریڈنگ کی درستگی", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Add Class", + "Add New User": "نئے صارف کا اضافہ کریں", + "Add Student": "Add Student", + "Add User to Group": " گروپ میں ایک نئےصارف کا اضافہ کریں", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "اپ ڈیٹ شامل کرنے سے قبل اس کا تصدیقی پیغام", + "Applying Updates...": "کسی اپ ڈیٹ کا اطلاق کرتے ہوئے ", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "ایک نیا فارم شروع کرتے ہوئے", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Average", + "Average Correct": "Average Correct", + "Average Correct (%)": "Average Correct (%)", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "کیس کا فولڈر جس میں تمام فارم رکھے گئے ہیں", + "Cases": "Cases", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "ایپ کی اپ ڈیٹس کو چیک کرنے کا لنک", + "Checking": "Checking", + "Checking For Updates...": "اپ ڈیٹس کو چیک کرتے وقت کاپیغام", + "Choose a task report from one of the following selections:": "Choose a task report from one of the following selections:", + "Choose type...": "Choose type...", + "Choose which case type": "جب کام شروع کریں تو صحیح کیس کے اقسام کو منتخب کریں ", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Class grouping", + "Classes": "Classes", + "Click a Picture": "اسکرین پر آنےوالی تصویر پر کلک کریں", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "فریم ورک پر کام شروع کرنے کے لیے پلے بٹن دبائیں ", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "CSV فائل ڈاؤن لوڈ کرنے کے لئے یہاں بٹن دبائیں", + "Close": "فل اسکرین موڈ کو بند کر دیں", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "فارم کی مکمل درجہ بندی ", + "Completed?": "Completed?", + "Concerning": "Concerning", + "Confirm New Password": "پاس ورڈ کو تبدیل کرتے ہوئے نئے پاس ورڈ کی تصدیق کریں", + "Confirm Password": "اسکرین پر پاس ورڈ کی تصدیق کریں", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "نتائج کو سنک کرتے وقت کا مسئلہ/ خرابی", + "Could Not Create User": "صارف بناتے وقت کا مسئلہ /خرابی", + "Could Not Generate APK": "APK کی تیاری کے دوران مسئلہ /خرابی", + "Could Not Generate PWA": "ویپ براوزر ایپ /پورٹل ڈسپلے پروگرام کی تیاری کے دوران مسئلہ /خرابی", + "Could Not Load List Of Forms": "فارم کے صفحہ کی فہرست پر مسئلہ /خرابی", + "Create": "Create", + "Create Form": "نیا فارم بنائیں", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "Date and Time", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Distance from reference", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "نتائج کو سرور پرمنتقل نہیں کیا گیا ", + "Docs Uploaded": "نتائج کو سرور پرمنتقل کیا گیا ", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "فارم کے لیے سی ایس وی فائل ڈاون لوڈ کریں", + "Download your APK": " اے پی کے فائل ڈاون لوڈ کریں", + "EXPORT DATA FOR ALL USERS": "ٹیبلیٹ پر موجود معلومات کو تمام صارفین کے لیے ایکسپورٹ کریں/بھیجے", + "Edit Item": "صفحہ پر موجودہ شے کو درست کریں ", + "Email": " ان پٹ ٹائپ کو ای میل کریں", + "End Date": "End Date", + "Enter your response to above question here": "مطلوبہ معیاری پیغام کے سوالات پوچھیں کہ وہ مکمل ہوچکے ہیں", + "Error Downloading File": "", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "کسی کیس کی کیفیت ", + "Export Backup": "Export Backup", + "Export Data": "ٹیبلیٹ سے ڈیٹا ایکسپورٹ کرنے کا لنک", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Feedback", + "File Stored At": "وہ جگہ جہاں ایکسپورٹ فائل رکھی کی جاتی ہے", + "File restored from ": "File restored from ", + "Filter": "Filter", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "First Name", + "Form": "فارم", + "Form Id": "فارم آئی ڈی ", + "Form Name": "Form Name", + "Form Title": "Form Title", + "Forms": "Forms", + "Generate APK/PWA": "اے پی کے لنک بنائیں", + "Generating CSV": "سی ایس وی فائل بناتے وقت پیغام کی درجہ بندی", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Good", + "Grade": "Grade", + "Great": "Great", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "سرور پر گروپ بنائیں", + "Group Created Succesfully": "گروپ بنانے کے بعد کا پیغام ", + "Group Details": "Group Details", + "Group Name": "Group Name", + "Grouping Report": "Grouping Report", + "Help": "Help", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "Incomplete", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "Item Listing", + "Item Not Found": "Item Not Found", + "Item Title": "Item Title", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "فریم ورک پر آخری کیاگیا کام/فہرست پر آخری کیاگیا کام", + "LOGIN": "LOGIN", + "Last Name": "Last Name", + "Last Successful Sync Timestamp": "آخری بار جب ٹیبلٹ سنک کیا گیا", + "Last attempted cannot be before an item marked.": "گرڈ پر نشان زد کیےآخری آئٹم کے لیے ایرر میسج( خرابی کا پیغام) کسی نا درست آئٹم سےپہلے نہیں ہوسکتا ", + "Latitude": "جی پی ایس ریڈنگ کا پھیلاو", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "میسج لوڈ ہو رہا ہے", + "Location": "Location", + "Login": "Login", + "Login Unsuccesful": "Login Unsuccesful", + "Logout": "Logout", + "Longitude": "جی پی ایس ریڈنگ کی لمبائی", + "MARK": "MARK", + "Maintenance": "Maintenance", + "Manage Groups": "Manage Groups", + "Manage Profile": "Manage Profile", + "Manage Users": "Manage Users", + "March": "March", + "May": "May", + "Mediocre": "Mediocre", + "Meters": "جی پی ایس درستگی کے لیے میٹر", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "ٹیبلیٹ پر مائی فارمز کا لنک", + "Name": "Name", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "New Form", + "New Group": "New Group", + "New Item": "New Item", + "New Password": "New Password", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "کسی فارم کے لیے ڈیٹا کی عدم موجودگی کا ایرر(یا خرابی)", + "No Forms Currently Defined": "", + "No Students currently registered.": "No Students currently registered.", + "No Update": "کوئی اپ ڈیٹ نہ ہونےکی صورت میں میسج کا اسٹیٹس", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "جانچ پڑتال /مشاہدہ کا لنک", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Open", + "Open a Case": "Open a Case", + "Opened": "Opened", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "Password", + "Password Reset Unsuccesful": "Password Reset Unsuccesful", + "Password is required": "Password is required", + "Passwords do not match": "Passwords do not match", + "Percentage Complete": "صفحہ کی درجہ بندی کو سنک کریں", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Percentile", + "Permission Denied.": "Permission Denied.", + "Permission Denied. Login to Continue": "Permission Denied. Login to Continue", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "لوکیشن لسٹ میں آئٹم جو ایک لیول سے پہلے شامل کیا گیا ہے", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "ای میل ایڈریس کے لیے ایرر میسج(غلطی کا پیغام)", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Poor", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "Progress", + "Projects": "Projects", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "RECOVER ACCOUNT", + "REGISTER": "REGISTER", + "REPORTS": "REPORTS", + "RESET": "RESET", + "RESET PASSWORD": "RESET PASSWORD", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "نئی پروڈکشن اے پی کے شائع کریں ", + "Release APK to QA": "نئی ٹیسٹنگ اے پی کے شائع کریں ", + "Release PWA to Production": "نئی پروڈکشن پی ڈبلیو اے شائع کریں ", + "Release PWA to QA": "نئی ٹیسٹنگ پی ڈبلیو اے شائع کریں ", + "Report": "Report", + "Report for": "Report for", + "Reports": "ٹیبلیٹ پر رپورٹس کے لنک", + "Response": "Response", + "Restore Backup": "Restore Backup", + "Results": "Results", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "SEARCH VIEW", + "START": "گرڈز پر اسٹارٹ کا بٹن", + "STOP": "گرڈز پر اسٹاپ کا بٹن", + "SUBMIT": "SUBMIT", + "SYNC DATA FOR ALL USERS": "تمام صارفین کےلیے معلومات کو منظم/درست کریں ", + "Save": "ترتیب کو محفوظ کریں ", + "Save before switching or your changes will be deleted.": "Save before switching or your changes will be deleted.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "School", + "Score": "Score", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "Searching", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Select Form Name", + "Select Report": "Select Report", + "Select Student": "Select Student", + "Select Subtask": "Select Subtask", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "ڈیفالٹ چیک باکس گروپ میسج", + "Select only one": "ڈیفالٹ ریڈیو بٹن گروپ میسج", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "Select your Username", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "Settings", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "Start Time", + "Status": "Status", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Student", + "Student Dashboard": "Student Dashboard", + "Student Grouping": "Student Grouping", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Student Subtest Report", + "Students Assessed": "Students Assessed", + "Students to watch": "Students to watch", + "SubTask Report": "SubTask Report", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Subtask", + "Subtest Name": "Subtest Name", + "Subtest Report": "Subtest Report", + "Success!": "Success!", + "Summary": "خلاصہ ", + "Support": "Support", + "Switch Editor": "Switch Editor", + "Sync": "سنک پیج ", + "Sync Successful": "Sync Successful", + "Sync Unsuccessful. Please Retry": " مطابقت داری /تواقت میں خرابی کا پیغام", + "Syncing Status By User": "Syncing Status By User", + "Syncing Status Summary": "Syncing Status Summary", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "اِن کریکٹ(نادرست) آئٹمز کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", + "Tap items to mark them incorrect.": "اِن کریکٹ(نادرست )آئٹمز کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "لاسٹ(آخری) آئٹم کو ہٹانےکے لیے گرڈ ان پٹ میسج کا استعمال", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Task Report", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "ہدایات کہ ایپ اپ ڈیٹ کو چیک کرےگی", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "کوئی فارم چھوڑتے ہوئے تصدیق کرنا کیوں کہ ڈیٹا محفوظ نہیں کیا گیا ہے", + "There is unsaved data. Are you sure you would like to exit the form?": "کوئی فارم چھوڑتے ہوئے تصدیق کرنا کیوں کہ ڈیٹا محفوظ نہیں کیا گیا ہے", + "This Field is Required": "This Field is Required", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "جی پی ایس کے لیے ٹِپز( اشاراتی)میسج", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "Total", + "Total Docs Uploaded": "Total Docs Uploaded", + "Total Docs not Uploaded": "Total Docs not Uploaded", + "Total Percentage Complete": "Total Percentage Complete", + "Total Updates Applied": "Total Updates Applied", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "جی پی ایس ہیلپ ٹیکسٹ", + "Try standing away from trees or buildings": "جی پی ایس ہیلپ ٹیکسٹ", + "Try standing next to a window": "جی پی ایس ہیلپ ٹیکسٹ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "اپ ڈیٹس کی چیکنگ( جانچ پڑتال )کرتے ہوئےخرابی کا پیغام ", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "Update App", + "Update is Running. Please Wait ...": "کچھ اپ ڈیٹ کرتے ہوئے اسٹیٹس", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "ٹینجارائن گروپ میں صارف کو شامل کیا گیا", + "User Created Succesfully": "صارف کامیابی سے بن گیا ", + "User Removed from Group Successfully": "یوزر(صارف)کو گروپ سے نکال دیا گیا", + "Username": "Username", + "Username Available": " صارف کے اندراج کے لیے صارف کا نام موجود ہے ", + "Username Unavailable": "صارف کا نام اس اندراج کے لیے موجود نہیں ہے ", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "View your PWA", + "Visits": "ٹیبلیٹ پر لنک", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "Write Failed", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "You do not have access to the resource.", + "You have not started this event": "You have not started this event", + "You have not started this form": "You have not started this form", + "You may not mark an item incorrect that is beyond the last item attempted.": "You may not mark an item incorrect that is beyond the last item attempted.", + "You may proceed.": "You may proceed.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "اے پی کے بلڈنگ کا اسٹیٹس میسج", + "Your PWA is building...": "ویپ براوزر بلڈنگ کا اسٹیٹس میسج", + "accept": "accept", + "and": "and", + "back": "پچھلے صفحہ پر جانے کے لیے بٹن دبائیں", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "close", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "events", + "here": "here", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "جی پی ایس ریڈنگ کا پھیلاو", + "loading": "loading", + "longitude": "جی پی ایس ریڈنگ کی لمبائی", + "manifest": "manifest", + "merged": "merged", + "new case": "نئے کیس کا لنک", + "new form": "new form", + "new issue": "new issue", + "next": "اگلے صفحہ پر جانے کے لیے بٹن دبائیں", + "no": "no", + "no, stop": "رضامندی کے لیے کوئی جواب نہیں ", + "open": "open", + "open cases": "open cases", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "response", + "result": "result", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "save", + "scan": "scan", + "searching": "searching", + "see form": "see form", + "start another": "start another", + "start event": "start event", + "start form": "start form", + "submit": "فارم جمع کرائیں", + "summary": "summary", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "ہاں ،رضامندی کے لیے تیار ہے ", + "✓ Yay! You are up to date.": "کامیاب اپ ڈیٹ کے بعد", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." +} \ No newline at end of file diff --git a/translations/translation.vn.json b/translations/translation.vn.json index 62e36eeb4f..65a30b53f9 100644 --- a/translations/translation.vn.json +++ b/translations/translation.vn.json @@ -1,229 +1,441 @@ { - "Unable to check for update. Make sure you are connected to the Internet and try again.":"Không thể kiểm tra cập nhật. Hãy chắc chắn rằng bạn được kết nối với internet và thử lại.", -"+ Add User to Group":"+ Thêm người dùng vào nhóm", -"+ Create a New Form":"+ Tạo một mẫu mới", -"+ Create a New Group":"+ Tạo một nhóm mới", -"+ Create a New User":"+ Tạo người dùng mới", -"Accuracy":"Sự chính xác", -"Accuracy Level":"Cấp độ chính xác", -"Add New User":"Thêm người dùng mới", -"Add User to Group":"Thêm người dùng vào nhóm", -"An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`":"Một bản cập nhật đang có sẵn. Hãy đảm bảo đồng bộ dữ liệu trước khi cài đặt bản cập nhật. Nếu bạn chưa đồng bộ dữ liệu, hãy nhấp vào `hủy`. Nếu bạn đã sẵn sàng để cài đặt bản cập nhật, hãy nhấp vào `yes`", -"Applying Updates...":"Đang cập nhật...", -"Are you sure you want to start a form response?":"Bạn có chắc chắn muốn bắt đầu một phản ứng mẫu?", -"There is unsaved data. Are you sure you would like to exit the form?":"Có dữ liệu chưa được lưu. Bạn có chắc chắn muốn thoát khỏi biểu mẫu?", -"The form is not yet complete. Are you sure you would like to exit the form?":"Các biểu mẫu vẫn chưa hoàn thành. Bạn có chắc chắn muốn thoát khỏi biểu mẫu?", -"The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.":"Ứng dụng này sẽ kiểm tra cập nhật ứng dụng và cố gắng tải xuống. Vui lòng kết nối với Internet trong quá trình này. Nhấn OK để tiến hành.", -"Case":"Trường hợp", -"Cases":"Các trường hợp", -"Check for Update":"Kiểm tra cập nhật", -"Checking For Updates...":"Kiểm tra các bản cập nhật…", -"Choose which case type":"Chọn loại trường hợp nào", -"Click a Picture":"Nhấp vào một hình ảnh.", -"Click the play button to get started.":"Nhấp vào nút Phát để bắt đầu.", -"Click to Download":"Bấm để tải xuống", -"Close":"Đóng", -"close":"Đóng", -"Confirm New Password":"Xác nhận mật khẩu mới", -"Confirm Password":"Xác nhận mật khẩu", -"Could Not Contact Server.":"Không thể liên hệ với máy chủ.", -"Could Not Create User":"Không thể tạo người dùng", -"Could Not Generate APK":"Không thể tạo APK", -"Could Not Generate PWA":"Không thể tạo PWA", -"Could Not Load List Of Forms":"Không thể tải danh sách mẫu biểu", -"Complete":"Hoàn thành", -"Create Form":"Tạo mẫu", -"Date and Time":"Ngày và giờ", -"Distance from reference":"Khoảng cách từ tài liệu tham khảo", -"Docs Not Uploaded":"Tài liệu không được tải lên", -"Docs Uploaded":"Tài liệu được tải lên", -"Download CSV":"Tải CSV", -"Download your APK":"Tải APK của bạn", -"EXPORT DATA FOR ALL USERS":"Xuất dữ liệu cho tất cả người dùng", -"Edit Item":"Chỉnh sửa mục", -"Email":"E-mail", -"Enter your response to above question here":"Nhập câu trả lời của bạn cho câu hỏi trên tại đây", -"Error Downloading File":"Lỗi tải tập tin", -"Event":"Sự kiện (unclear context)", -"events":"Các sự kiện (unclear context)", -"Export Data":"Xuất dữ liệu", -"File Stored At":"Tập tin được lưu trữ tại", -"Filter":"Lọc", -"First Name":"Tên", -"Form":"Biểu mẫu", -"Form Id":"Mẫu ID.", -"Form Name":"Tên mẫu", -"Form Title":"Tiêu đề mẫu", -"Forms":"Biểu mẫu", -"Generate APK/PWA":"Tạo APK / PWA", -"Generating CSV":"Tạo ra CSV.", -"Group":"Nhóm", -"Group Created Succesfully":"Nhóm được tạo thành công", -"Group Details":"Chi tiết nhóm", -"Group Name":"Tên nhóm", -"Help":"Giúp đỡ", -"Incomplete":"chưa hoàn thiện", -"Item Listing":"Danh sách mục", -"Item Not Found":"Không tìm thấy bảng mục", -"Item Title":"Danh mục", -"LAST ATTEMPTED":"Lần thực hiện cuối cùng", -"LOGIN":"ĐĂNG NHẬP", -"Last Name":"Họ", -"Last Successful Sync Timestamp":"Thời gian đồng bộ hóa thành công lần cuối", -"Last attempted cannot be before an item marked.":"Lần thử cuối không thể thực hiện trước khi danh mục được đánh dấu", -"Latitude":"Vĩ độ.", -"latitude":"vĩ độ.", -"Loading":"Đang tải", -"loading":"Đang tải", -"Login":"Đăng nhập", -"Login Unsuccesful":"Đăng nhập không thành công.", -"Logout":"Đăng xuất", -"Longitude":"Kinh độ", -"longitude":"kinh độ", -"MARK":"DẤU", -"Manage Groups":"Quản lý nhóm", -"Manage Profile":"Quản lý hồ sơ.", -"Manage Users":"Quản lý người dùng", -"manifest":"rõ ràng", -"Meters":"Mét", -"My Forms":"Biểu mẫu của tôi", -"new case":"Trường hợp mới", -"New Form":"Biểu mẫu mới", -"New Group":"Nhóm mới", -"New Item":"Danh mục mới", -"New Password":"mật khẩu mới", -"No Data for":"Không có dữ liệu cho", -"No Forms Currently Defined":"Không có biểu mẫu nào được xác định", -"No Update":"Không có cập nhật", -"Observations":"Quan sát.", -"Open":"Mở", -"open":"mở", -"Opened":"Mở.", -"Open a Case":"Mở một trường hợp", -"open cases":"Mở các trường hợp", -"Password":"Mật khẩu", -"Password Reset Unsuccesful":"Đặt lại mật khẩu không thành công", -"Passwords do not match":"Mật khẩu không đúng", -"Percentage Complete":"Tỷ lệ phần trăm hoàn thành", -"Permission Denied.":"Bị từ chối", -"Permission Denied. Login to Continue":"Bị từ chối. Đăng nhập để tiếp tục", -"Pick a":"Chọn a.", -"Please enter a valid email address":"Vui lòng nhập một địa chỉ email hợp lệ", -"Progress":"Tiến độ", -"Projects":"Dự án.", -"RECOVER ACCOUNT":"KHÔI PHỤC TÀI KHOẢN", -"REGISTER":"ĐĂNG KÝ", -"RESET":"CÀI LẠI", -"RESET PASSWORD":"ĐẶT LẠI MẬT KHẨU", -"Release APK to Production":"Phát hành APK để sản xuất", -"Release APK to QA":"Phát hành APK đến QA", -"Release PWA to Production":"Phát hành PWA để sản xuất", -"Release PWA to QA":"Phát hành PWA đến QA", -"Reports":"Báo cáo", -"Response":"Phản ứng", -"response":"phản ứng", -"START":"BẮT ĐẦU", -"STOP":"Dừng lại", -"SYNC DATA FOR ALL USERS":"Đồng bộ hóa dữ liệu cho tất cả người dùng", -"Save":"Lưu", -"save":"Lưu", -"Save before switching or your changes will be deleted.":"Lưu trước khi chuyển đổi hoặc thay đổi của bạn sẽ bị xóa.", -"School":"Trường", -"Searching":"Đang tìm kiếm", -"searching":"đang tìm kiếm", -"Select Form Name":"Chọn tên mẫu", -"Select one or more":"Chọn một hoặc nhiều", -"Select only one":"Chỉ chọn một", -"Select your Username":"Chọn tên người dùng của bạn", -"Settings":"Cài đặt", -"start another":"Khởi động khác", -"start event":"Bắt đầu sự kiện", -"start form":"Bắt đầu biểu mẫu", -"Start Time":"Thời gian bắt đầu", -"Status":"Trạng thái", -"submit":"Gửi đi", -"Summary":"Tóm lược", -"summary":"tóm lược", -"Support":"Hỗ trợ", -"Switch Editor":"Chuyển đổi người biên tập", -"Sync":"Đồng bộ hóa", -"Sync Successful":"Đồng bộ hóa thành công", -"Sync Unsuccessful. Please Retry":"Đồng bộ hóa không thành công. Xin hãy thử lại", -"Syncing Status By User":"Trạng thái đồng bộ của người dùng", -"Syncing Status Summary":"Tóm tắt trạng thái đồng bộ", -"Tangerine":"Tangerine", -"Tap any boxes that were incorrect during the test.":"Nhấn vào các ô không thực hiện đúng khi làm bài kiểm tra", -"Tap items to mark them incorrect.":"Nhấn các mục để đánh dấu chúng không chính xác.", -"Tap the item last attempted.":"Nhấn vào mục đã thử lần cuối.", -"This Field is Required":"Trường này là bắt buộc", -"Tips":"Lời khuyên", -"Total":"Toàn bộ", -"Total Docs Uploaded":"Tổng số tài liệu được tải lên", -"Total Docs not Uploaded":"Tổng số tài liệu không được tải lên", -"Total Percentage Complete":"Tổng phần trăm hoàn thành", -"Total Updates Applied":"Tổng số bản cập nhật được áp dụng.", -"Try moving outside with a clear view of the sky":"Hãy thử di chuyển ra ngoài nơi nhìn rõ bầu trời", -"Try standing away from trees or buildings":"Hãy thử đứng cách xa cây hoặc tòa nhà", -"Try standing next to a window":"Hãy thử đứng cạnh một cửa sổ", -"Update App":"Cập nhật ứng dụng", -"Update is Running. Please Wait ...":"Cập nhật đang chạy. Vui lòng chờ ...", -"User Added to Group Successfully":"Người dùng thêm vào nhóm thành công", -"User Created Succesfully":"Người dùng được tạo thành công", -"User Removed from Group Successfully":"Người dùng bị xóa khỏi nhóm thành công", -"Username":"Tên người dùng", -"Username Available":"Tên người dùng có sẵn", -"Username Unavailable":"Tên người dùng không có sẵn", -"View your PWA":"Xem PWA của bạn", -"Visits":"Lượt truy cập.", -"Write Failed":"Viết thất bại", -"You do not have access to the resource.":"Bạn không có quyền truy cập vào tài nguyên.", -"You have not started this event":"Bạn chưa bắt đầu sự kiện này", -"You have not started this form":"Bạn chưa bắt đầu mẫu này", -"You may not mark an item incorrect that is beyond the last item attempted.":"Bạn có thể đã không đánh dấu một mục không chính xác ngoài mục đã vừa thực hiện", -"You may proceed.":"Bạn có thể tiến hành.", -"Your APK is building...":"APK của bạn đang xây dựng ...", -"Your PWA is building...":"PWA của bạn đang xây dựng ...", -"here":"đây", -"✓ Yay! You are up to date.":"✓ Yay! Bạn đã cập nhật xong", -"yes, continue":"Vâng, tiếp tục", -"no, stop":"Không, dừng lại", -"SEARCH VIEW":"Tìm kiếm Xem.", -"next":"tiếp theo", -"back":"trở lại", -"Average Correct (%)":"Tiỉ lệ đúng trung bình", -"Average Correct":"Trung bình đúng", -"Students to watch":"Học sinh xem", -"Feedback":"Nhận xét", -"Add Student":"Thêm học sinh", -"Add Class":"Thêm lớp", -"Select Report":"Chọn Báo cáo", -"Class grouping":"Nhóm lớp", -"Student Subtest Report":"Báo cáo Subtest của sinh viên.", -"Task Report":"Báo cáo nhiệm vụ", -"Choose a task report from one of the following selections":"Chọn một báo cáo nhiệm vụ từ một trong các lựa chọn sau", -"SubTask Report":"Báo cáo SubTask.", -"Subtask":"Tiểu đơn", -"Average":"Trung bình", -"Students Assessed":"Học sinh đã kiểm tra", -"Grouping Report":"Báo cáo nhóm", -"Name":"Tên", -"Status":"Trạng thái", -"Student Grouping":"Nhóm học sinh", -"Student":"Học sinh", -"Score":"Điểm", -"Percentile":"Tỷ lệ phần trăm.", -"Great":"Tuyệt quá", -"Good":"Tốt", -"Mediocre":"Bình thường", -"Poor":"Kém", -"Concerning":"Cần xem xét", -"result":"kết quả", -"Completed?":"Đã hoàn thành?", -"Student":"Học sinh", -"Student Dashboard":"Bảng điều khiển sinh viên", -"Select Subtask":"Chọn SubTask.", -"SUBMIT":"GỬI ĐI", -"Subtest Report":"BÁO CÁO SUBTEST.", -"Select Student":"Chọn học sinh", -"Results":"Các kết quả" + "% Correct": "% Correct", + "+ Add User to Group": "+ Thêm người dùng vào nhóm", + "+ Create a New Form": "+ Tạo một mẫu mới", + "+ Create a New Group": "+ Tạo một nhóm mới", + "+ Create a New User": "+ Tạo người dùng mới", + "About": "About", + "Accuracy": "Sự chính xác", + "Accuracy Level": "Cấp độ chính xác", + "Accuracy Level:": "Accuracy Level:", + "Activity": "Activity", + "Add Class": "Thêm lớp", + "Add New User": "Thêm người dùng mới", + "Add Student": "Thêm học sinh", + "Add User to Group": "Thêm người dùng vào nhóm", + "After submitting updated settings, you will be required to log in again.": "After submitting updated settings, you will be required to log in again.", + "An update is available. Be sure to first sync your data before installing the update. If you have not done this, click `Cancel`. If you are ready to install the update, click `Yes`": "Một bản cập nhật đang có sẵn. Hãy đảm bảo đồng bộ dữ liệu trước khi cài đặt bản cập nhật. Nếu bạn chưa đồng bộ dữ liệu, hãy nhấp vào `hủy`. Nếu bạn đã sẵn sàng để cài đặt bản cập nhật, hãy nhấp vào `yes`", + "Applying Updates...": "Đang cập nhật...", + "April": "April", + "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.": "Are you sure you want to restore this backup? It will wipe any data already in Tangerine.", + "Are you sure you want to start a form response?": "Bạn có chắc chắn muốn bắt đầu một phản ứng mẫu?", + "Are you sure you would like to exit the form?": "Are you sure you would like to exit the form?", + "Attend.": "Attend.", + "Attendance": "Attendance", + "August": "August", + "Average": "Trung bình", + "Average Correct": "Trung bình đúng", + "Average Correct (%)": "Tiỉ lệ đúng trung bình", + "Back": "Back", + "Backup directory": "Backup directory", + "Before continuing, let's review this info to make sure you registered with the right device info.": "Before continuing, let's review this info to make sure you registered with the right device info.", + "Begin Attendance record for today?": "Begin Attendance record for today?", + "Behav.": "Behav.", + "Behavior": "Behavior", + "Camera authorized.": "Camera authorized.", + "Case": "Trường hợp", + "Cases": "Các trường hợp", + "Change Class": "Change Class", + "Change Subject": "Change Subject", + "Check for Update": "Kiểm tra cập nhật", + "Checking": "Checking", + "Checking For Updates...": "Kiểm tra các bản cập nhật…", + "Choose a task report from one of the following selections:": "Chọn một báo cáo nhiệm vụ từ một trong các lựa chọn sau", + "Choose type...": "Choose type...", + "Choose which case type": "Chọn loại trường hợp nào", + "Class": "Class", + "Class Configuration": "Class Configuration", + "Class Grouping": "Class Grouping", + "Class Size": "Class Size", + "Class grouping": "Nhóm lớp", + "Classes": "Classes", + "Click a Picture": "Nhấp vào một hình ảnh.", + "Click on a percentile to view related feedback.": "Click on a percentile to view related feedback.", + "Click the play button to get started.": "Nhấp vào nút Phát để bắt đầu.", + "Click the wrench icon to enable an archived class.": "Click the wrench icon to enable an archived class.", + "Click to Download": "Bấm để tải xuống", + "Close": "Đóng", + "Close the application completely and re-open.": "Close the application completely and re-open.", + "Complete": "Hoàn thành", + "Completed?": "Đã hoàn thành?", + "Concerning": "Cần xem xét", + "Confirm New Password": "Xác nhận mật khẩu mới", + "Confirm Password": "Xác nhận mật khẩu", + "Confirm Password is required": "Confirm Password is required", + "Continue": "Continue", + "Correct": "Correct", + "Could Not Contact Server.": "Không thể liên hệ với máy chủ.", + "Could Not Create User": "Không thể tạo người dùng", + "Could Not Generate APK": "Không thể tạo APK", + "Could Not Generate PWA": "Không thể tạo PWA", + "Could Not Load List Of Forms": "Không thể tải danh sách mẫu biểu", + "Create": "Create", + "Create Form": "Tạo mẫu", + "Create New Case": "Create New Case", + "Creating new case...": "Creating new case...", + "Current": "Current", + "Curriculum": "Curriculum", + "Custom Date Range Report": "Custom Date Range Report", + "DATA QUERIES": "DATA QUERIES", + "Dashboard": "Dashboard", + "Date": "Date", + "Date and Time": "Ngày và giờ", + "Day": "Day", + "Day View": "Day View", + "December": "December", + "Device ID": "Device ID", + "Differences": "Differences", + "Distance from reference": "Khoảng cách từ tài liệu tham khảo", + "Do you have a Device QR code to scan?": "Do you have a Device QR code to scan?", + "Docs Not Uploaded": "Tài liệu không được tải lên", + "Docs Uploaded": "Tài liệu được tải lên", + "Does the above info look like the right device info?": "Does the above info look like the right device info?", + "Done! Please exit the app and restart.": "Done! Please exit the app and restart.", + "Download CSV": "Tải CSV", + "Download your APK": "Tải APK của bạn", + "EXPORT DATA FOR ALL USERS": "Xuất dữ liệu cho tất cả người dùng", + "Edit Item": "Chỉnh sửa mục", + "Email": "E-mail", + "End Date": "End Date", + "Enter your response to above question here": "Nhập câu trả lời của bạn cho câu hỏi trên tại đây", + "Error Downloading File": "Lỗi tải tập tin", + "Error restoring db ": "Error restoring db ", + "Error saving. Please try again.": "Error saving. Please try again.", + "Event": "Sự kiện (unclear context)", + "Export Backup": "Export Backup", + "Export Data": "Xuất dữ liệu", + "Export Data creates a backup of all of your records and saves it to your device.": "Export Data creates a backup of all of your records and saves it to your device.", + "Failed to download application configuration file": "Failed to download application configuration file", + "February": "February", + "Feedback": "Nhận xét", + "File Stored At": "Tập tin được lưu trữ tại", + "File restored from ": "File restored from ", + "Filter": "Lọc", + "Find Case": "Find Case", + "Finished restoring backups. Please wait for indexing to complete.": "Finished restoring backups. Please wait for indexing to complete.", + "First Name": "Tên", + "Form": "Biểu mẫu", + "Form Id": "Mẫu ID.", + "Form Name": "Tên mẫu", + "Form Title": "Tiêu đề mẫu", + "Forms": "Biểu mẫu", + "Generate APK/PWA": "Tạo APK / PWA", + "Generating CSV": "Tạo ra CSV.", + "Geolocation authorized.": "Geolocation authorized.", + "Good": "Tốt", + "Grade": "Grade", + "Great": "Tuyệt quá", + "Great! Use this QR scanner below to scan the code in.": "Great! Use this QR scanner below to scan the code in.", + "Group": "Nhóm", + "Group Created Succesfully": "Nhóm được tạo thành công", + "Group Details": "Chi tiết nhóm", + "Group Name": "Tên nhóm", + "Grouping Report": "Báo cáo nhóm", + "Help": "Giúp đỡ", + "Home": "Home", + "ISSUES": "ISSUES", + "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.": "If APK (running on a tablet): Place files (encrypted database backup) or directories (non-encrypted database backups) in the Documents/Tangerine/restore directory. Press the button below to start the restore process.", + "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.": "If PWA (running on a computer and/or in a web browser): Press the button below and choose the directory where the backup files are stored. This will start the restore process.", + "Incomplete": "chưa hoàn thiện", + "Instructions:": "Instructions:", + "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.": "Is there is an error that says 'Is Backup a File?: false' - this means that you probably have a backup from a non-encrypted database, which backs up to a directory instead of a file.", + "Item Listing": "Danh sách mục", + "Item Not Found": "Không tìm thấy bảng mục", + "Item Title": "Danh mục", + "January": "January", + "July": "July", + "June": "June", + "LAST ATTEMPTED": "Lần thực hiện cuối cùng", + "LOGIN": "ĐĂNG NHẬP", + "Last Name": "Họ", + "Last Successful Sync Timestamp": "Thời gian đồng bộ hóa thành công lần cuối", + "Last attempted cannot be before an item marked.": "Lần thử cuối không thể thực hiện trước khi danh mục được đánh dấu", + "Latitude": "Vĩ độ.", + "Let's get your device set up.": "Let's get your device set up.", + "Let's try again.": "Let's try again.", + "Loading": "Đang tải", + "Location": "Location", + "Login": "Đăng nhập", + "Login Unsuccesful": "Đăng nhập không thành công.", + "Logout": "Đăng xuất", + "Longitude": "Kinh độ", + "MARK": "DẤU", + "Maintenance": "Maintenance", + "Manage Groups": "Quản lý nhóm", + "Manage Profile": "Quản lý hồ sơ.", + "Manage Users": "Quản lý người dùng", + "March": "March", + "May": "May", + "Mediocre": "Bình thường", + "Meters": "Mét", + "Month": "Month", + "Most Recent Class": "Most Recent Class", + "Most recent": "Most recent", + "My Forms": "Biểu mẫu của tôi", + "Name": "Tên", + "New Case": "New Case", + "New Event": "New Event", + "New Form": "Biểu mẫu mới", + "New Group": "Nhóm mới", + "New Item": "Danh mục mới", + "New Password": "mật khẩu mới", + "New comment by you": "New comment by you", + "Next": "Next", + "No Data for": "Không có dữ liệu cho", + "No Forms Currently Defined": "Không có biểu mẫu nào được xác định", + "No Students currently registered.": "No Students currently registered.", + "No Update": "Không có cập nhật", + "No absences recorded in the past month.": "No absences recorded in the past month.", + "No changes proposed yet.": "No changes proposed yet.", + "None": "None", + "Notifications authorized.": "Notifications authorized.", + "November": "November", + "Number of responses not uploaded": "Number of responses not uploaded", + "Number of responses uploaded": "Number of responses uploaded", + "Observations": "Quan sát.", + "October": "October", + "Online Sync": "Online Sync", + "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.": "Online Sync is used when there is a reliable Internet connection. If you have no Internet connection, use the P2P tab above to transfer records between nearby devices.", + "Open": "Mở", + "Open a Case": "Mở một trường hợp", + "Opened": "Mở.", + "Opening Case...": "Opening Case...", + "Opening Event Form...": "Opening Event Form...", + "Opening event...": "Opening event...", + "Optimizing data. This may take several minutes. Please wait...": "Optimizing data. This may take several minutes. Please wait...", + "Participant ID": "Participant ID", + "Password": "Mật khẩu", + "Password Reset Unsuccesful": "Đặt lại mật khẩu không thành công", + "Password is required": "Password is required", + "Passwords do not match": "Mật khẩu không đúng", + "Percentage Complete": "Tỷ lệ phần trăm hoàn thành", + "Percentage uploaded:": "Percentage uploaded:", + "Percentile": "Tỷ lệ phần trăm.", + "Permission Denied.": "Bị từ chối", + "Permission Denied. Login to Continue": "Bị từ chối. Đăng nhập để tiếp tục", + "Persistent storage authorized.": "Persistent storage authorized.", + "Pick a": "Chọn a.", + "Please choose your language": "Please choose your language", + "Please enter a valid email address": "Vui lòng nhập một địa chỉ email hợp lệ", + "Please retry sync. Are you connected to the Internet?": "Please retry sync. Are you connected to the Internet?", + "Poor": "Kém", + "Press the Start button below to transfer records to the server.": "Press the Start button below to transfer records to the server.", + "Prev": "Prev", + "Processing ": "Processing ", + "Processing Directory: ": "Processing Directory: ", + "Progress": "Tiến độ", + "Projects": "Dự án.", + "Propose": "Propose", + "Proposed": "Proposed", + "RECOVER ACCOUNT": "KHÔI PHỤC TÀI KHOẢN", + "REGISTER": "ĐĂNG KÝ", + "REPORTS": "REPORTS", + "RESET": "CÀI LẠI", + "RESET PASSWORD": "ĐẶT LẠI MẬT KHẨU", + "RESTORE BACKUP": "RESTORE BACKUP", + "REVIEW": "REVIEW", + "Ready": "Ready", + "Rebase issue on current response": "Rebase issue on current response", + "Release APK to Production": "Phát hành APK để sản xuất", + "Release APK to QA": "Phát hành APK đến QA", + "Release PWA to Production": "Phát hành PWA để sản xuất", + "Release PWA to QA": "Phát hành PWA đến QA", + "Report": "Report", + "Report for": "Report for", + "Reports": "Báo cáo", + "Response": "Phản ứng", + "Restore Backup": "Restore Backup", + "Results": "Các kết quả", + "SCHEDULE": "SCHEDULE", + "SCHEDULE VIEW": "SCHEDULE VIEW", + "SEARCH": "SEARCH", + "SEARCH VIEW": "Tìm kiếm Xem.", + "START": "BẮT ĐẦU", + "STOP": "Dừng lại", + "SUBMIT": "GỬI ĐI", + "SYNC DATA FOR ALL USERS": "Đồng bộ hóa dữ liệu cho tất cả người dùng", + "Save": "Lưu", + "Save before switching or your changes will be deleted.": "Lưu trước khi chuyển đổi hoặc thay đổi của bạn sẽ bị xóa.", + "Saving event...": "Saving event...", + "Scan Code": "Scan Code", + "School": "Trường", + "Score": "Điểm", + "Score average": "Score average", + "Score must be between 0 and 100": "Score must be between 0 and 100", + "Score.": "Score.", + "Scores": "Scores", + "Scoring": "Scoring", + "Screening ID": "Screening ID", + "Scroll to the right to view the results for subjects and units": "Scroll to the right to view the results for subjects and units", + "Search cases": "Search cases", + "Searching": "Đang tìm kiếm", + "Searching...": "Searching...", + "Security question is required": "Security question is required", + "Select Form Name": "Chọn tên mẫu", + "Select Report": "Chọn Báo cáo", + "Select Student": "Chọn học sinh", + "Select Subtask": "Chọn SubTask.", + "Select a start and end date to view report for that period": "Select a start and end date to view report for that period", + "Select a unit to enter scoring": "Select a unit to enter scoring", + "Select a unit to view report for that period": "Select a unit to view report for that period", + "Select case type": "Select case type", + "Select one or more": "Chọn một hoặc nhiều", + "Select only one": "Chỉ chọn một", + "Select the appropriate case type from the options listed below": "Select the appropriate case type from the options listed below", + "Select your Username": "Chọn tên người dùng của bạn", + "September": "September", + "Set a password to administer your device": "Set a password to administer your device", + "Settings": "Cài đặt", + "Settings have been updated. You will now be redirected to log in.": "Settings have been updated. You will now be redirected to log in.", + "Sharing failed. The following apps are available:": "Sharing failed. The following apps are available:", + "Something went wrong, please try again.": "Something went wrong, please try again.", + "Something went wrong; you may not have Internet access.": "Something went wrong; you may not have Internet access.", + "Start": "Start", + "Start Date": "Start Date", + "Start Time": "Thời gian bắt đầu", + "Status": "Trạng thái", + "Status.Concerning": "Status.Concerning", + "Status.Good": "Status.Good", + "Status.Great": "Status.Great", + "Status.Poor": "Status.Poor", + "Stud.": "Stud.", + "Student": "Học sinh", + "Student Dashboard": "Bảng điều khiển sinh viên", + "Student Grouping": "Nhóm học sinh", + "Student Report": "Student Report", + "Student Scores": "Student Scores", + "Student Subtest Report": "Báo cáo Subtest của sinh viên.", + "Students Assessed": "Học sinh đã kiểm tra", + "Students to watch": "Học sinh xem", + "SubTask Report": "Báo cáo SubTask.", + "Subject scores": "Subject scores", + "Submit": "Submit", + "Submitting...": "Submitting...", + "Subtask": "Tiểu đơn", + "Subtest Name": "Subtest Name", + "Subtest Report": "BÁO CÁO SUBTEST.", + "Success!": "Success!", + "Summary": "Tóm lược", + "Support": "Hỗ trợ", + "Switch Editor": "Chuyển đổi người biên tập", + "Sync": "Đồng bộ hóa", + "Sync Successful": "Đồng bộ hóa thành công", + "Sync Unsuccessful. Please Retry": "Đồng bộ hóa không thành công. Xin hãy thử lại", + "Syncing Status By User": "Trạng thái đồng bộ của người dùng", + "Syncing Status Summary": "Tóm tắt trạng thái đồng bộ", + "Tangerine": "Tangerine", + "Tap any boxes that were incorrect during the test.": "Nhấn vào các ô không thực hiện đúng khi làm bài kiểm tra", + "Tap items to mark them incorrect.": "Nhấn các mục để đánh dấu chúng không chính xác.", + "Tap on the green checkmark to mark a student as absent": "Tap on the green checkmark to mark a student as absent", + "Tap the item last attempted.": "Nhấn vào mục đã thử lần cuối.", + "Tap the link to complete the student behavior form": "Tap the link to complete the student behavior form", + "Task Report": "Báo cáo nhiệm vụ", + "That's ok. Enter the device ID and token below.": "That's ok. Enter the device ID and token below.", + "The app will now check for an application update and attempt to download. Please stay connected to the Internet during this process. Tap OK to proceed.": "Ứng dụng này sẽ kiểm tra cập nhật ứng dụng và cố gắng tải xuống. Vui lòng kết nối với Internet trong quá trình này. Nhấn OK để tiến hành.", + "The date cannot be in the future. Please enter a date that is on or before today.": "The date cannot be in the future. Please enter a date that is on or before today.", + "The date is missing. Please enter a valid date.": "The date is missing. Please enter a valid date.", + "The date is not valid. Please enter a valid date.": "The date is not valid. Please enter a valid date.", + "The form is not yet complete. Are you sure you would like to exit the form?": "Các biểu mẫu vẫn chưa hoàn thành. Bạn có chắc chắn muốn thoát khỏi biểu mẫu?", + "There is unsaved data. Are you sure you would like to exit the form?": "Có dữ liệu chưa được lưu. Bạn có chắc chắn muốn thoát khỏi biểu mẫu?", + "This Field is Required": "Trường này là bắt buộc", + "This feature copies backup databases to the Tangerine application.": "This feature copies backup databases to the Tangerine application.", + "This student does not have a phone number": "This student does not have a phone number", + "This student does not have a phone number.": "This student does not have a phone number.", + "Tips": "Lời khuyên", + "Today": "Today", + "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.": "Toggle a class 'off' to archive. The toggle will be white when 'off'. Click a class 'on' to enable. The toggle will be orange when 'on'.", + "Total": "Toàn bộ", + "Total Docs Uploaded": "Tổng số tài liệu được tải lên", + "Total Docs not Uploaded": "Tổng số tài liệu không được tải lên", + "Total Percentage Complete": "Tổng phần trăm hoàn thành", + "Total Updates Applied": "Tổng số bản cập nhật được áp dụng.", + "Totals": "Totals", + "Troubleshooting:": "Troubleshooting:", + "Try moving outside with a clear view of the sky": "Hãy thử di chuyển ra ngoài nơi nhìn rõ bầu trời", + "Try standing away from trees or buildings": "Hãy thử đứng cách xa cây hoặc tòa nhà", + "Try standing next to a window": "Hãy thử đứng cạnh một cửa sổ", + "Unable to check for update. Make sure you are connected to the Internet and try again.": "Không thể kiểm tra cập nhật. Hãy chắc chắn rằng bạn được kết nối với internet và thử lại.", + "Unassigned Category": "Unassigned Category", + "Unit Report": "Unit Report", + "Unknown": "Unknown", + "Update App": "Cập nhật ứng dụng", + "Update is Running. Please Wait ...": "Cập nhật đang chạy. Vui lòng chờ ...", + "Updating": "Updating", + "Updating...": "Updating...", + "Use PouchDB's last sequence tracking when syncing.": "Use PouchDB's last sequence tracking when syncing.", + "User Added to Group Successfully": "Người dùng thêm vào nhóm thành công", + "User Created Succesfully": "Người dùng được tạo thành công", + "User Removed from Group Successfully": "Người dùng bị xóa khỏi nhóm thành công", + "Username": "Tên người dùng", + "Username Available": "Tên người dùng có sẵn", + "Username Unavailable": "Tên người dùng không có sẵn", + "Username is required": "Username is required", + "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'": "View the log of the process. Wait for all the files to be copied. When it is complete, it will display 'Please exit the app and restart.'", + "View your PWA": "Xem PWA của bạn", + "Visits": "Lượt truy cập.", + "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?": "Warning: Interrupting a process may lead to data corruption and data loss. Are you sure you want to continue?", + "We will now prompt for a series of permissions. Click next and then allow each permission.": "We will now prompt for a series of permissions. Click next and then allow each permission.", + "Week View": "Week View", + "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.": "When this page opens, it checks if there is a Documents directory and creates the necessary Tangerine, backups, and restore directories. If the Documents directory is not available, it will display an error message below. You may use the device's File manager (or download Google Files) to create the Documents directory in Internal Storage.", + "Would you like to update? We recommend syncing data before you do.": "Would you like to update? We recommend syncing data before you do.", + "Write Failed": "Viết thất bại", + "Year": "Year", + "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.": "You cannot merge the proposed changes because the Form Response has been updated since the Issue was created. Propose a new change based on the current version of the Form Response.", + "You do not have access to the resource.": "Bạn không có quyền truy cập vào tài nguyên.", + "You have not started this event": "Bạn chưa bắt đầu sự kiện này", + "You have not started this form": "Bạn chưa bắt đầu mẫu này", + "You may not mark an item incorrect that is beyond the last item attempted.": "Bạn có thể đã không đánh dấu một mục không chính xác ngoài mục đã vừa thực hiện", + "You may proceed.": "Bạn có thể tiến hành.", + "You must register students before you can view the attendance dashboard.": "You must register students before you can view the attendance dashboard.", + "Your APK is building...": "APK của bạn đang xây dựng ...", + "Your PWA is building...": "PWA của bạn đang xây dựng ...", + "accept": "accept", + "and": "and", + "back": "trở lại", + "by": "by", + "cancel": "cancel", + "changes": "changes", + "clear": "clear", + "close": "Đóng", + "closed": "closed", + "comment": "comment", + "continue": "continue", + "events": "Các sự kiện (unclear context)", + "here": "đây", + "issue rebased on updated response": "issue rebased on updated response", + "latitude": "vĩ độ.", + "loading": "Đang tải", + "longitude": "kinh độ", + "manifest": "rõ ràng", + "merged": "merged", + "new case": "Trường hợp mới", + "new form": "new form", + "new issue": "new issue", + "next": "tiếp theo", + "no": "no", + "no, stop": "Không, dừng lại", + "open": "mở", + "open cases": "Mở các trường hợp", + "opened": "opened", + "proposed changes merged": "proposed changes merged", + "response": "phản ứng", + "result": "kết quả", + "review case": "review case", + "review form": "review form", + "revision": "revision", + "revisions": "revisions", + "save": "Lưu", + "scan": "scan", + "searching": "đang tìm kiếm", + "see form": "see form", + "start another": "Khởi động khác", + "start event": "Bắt đầu sự kiện", + "start form": "Bắt đầu biểu mẫu", + "submit": "Gửi đi", + "summary": "tóm lược", + "updated settings": "updated settings", + "yes": "yes", + "yes, continue": "Vâng, tiếp tục", + "✓ Yay! You are up to date.": "✓ Yay! Bạn đã cập nhật xong", + "✓ Yay, You are up to date.": "✓ Yay, You are up to date." } \ No newline at end of file From 9d3f9b88a6bde566ff9d44524dfa700239794833 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 7 Feb 2024 12:24:51 -0500 Subject: [PATCH 42/43] Reintroduce registrationRequiresServerUser app config setting to make managing central user more flexible --- client/src/app/shared/_classes/app-config.class.ts | 5 ++++- .../src/app/shared/_guards/create-profile-guard.service.ts | 4 +++- .../import-user-profile/import-user-profile.component.html | 6 +++--- .../import-user-profile/import-user-profile.component.ts | 1 + translations/translation.en.json | 2 ++ translations/translation.es_gt.json | 2 ++ 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/src/app/shared/_classes/app-config.class.ts b/client/src/app/shared/_classes/app-config.class.ts index a7d97826bd..9694b2a680 100644 --- a/client/src/app/shared/_classes/app-config.class.ts +++ b/client/src/app/shared/_classes/app-config.class.ts @@ -82,8 +82,11 @@ export class AppConfig { // Profile configuration. // - // This setting only applies to Sync Protocol 1. + // centrallyManagedUserProfile and registrationRequiresServerUser are mutually exclusive. If both are set to true, the app will default to using centrallyManagedUserProfile. + // The user profile is managed by the server and not the Device. This setting is only applicable to Sync Protocol 1. centrallyManagedUserProfile = false + // The user profile is initially managed by the server and can be updated on the client. This setting is only applicable to Sync Protocol 2. + registrationRequiresServerUser = false // Hides the user profile link to edit when on the Device. hideProfile = false // Hides the about page. diff --git a/client/src/app/shared/_guards/create-profile-guard.service.ts b/client/src/app/shared/_guards/create-profile-guard.service.ts index 8ce2516f16..ad76754d24 100755 --- a/client/src/app/shared/_guards/create-profile-guard.service.ts +++ b/client/src/app/shared/_guards/create-profile-guard.service.ts @@ -19,7 +19,9 @@ export class CreateProfileGuardService implements CanActivate { } else { const appConfig = await this.appConfigService.getAppConfig() let navigateUrl = '' - if (appConfig.centrallyManagedUserProfile === true && (appConfig.syncProtocol === '1' || !appConfig.syncProtocol)) { + if ((appConfig.centrallyManagedUserProfile === true || appConfig.registrationRequiresServerUser === true) && + (appConfig.syncProtocol === '1' || !appConfig.syncProtocol) + ) { navigateUrl = '/import-user-profile' } else if (appConfig.syncProtocol === '2') { navigateUrl = '/associate-user-profile' diff --git a/client/src/app/user-profile/import-user-profile/import-user-profile.component.html b/client/src/app/user-profile/import-user-profile/import-user-profile.component.html index 685edc4b85..71ad6c9154 100644 --- a/client/src/app/user-profile/import-user-profile/import-user-profile.component.html +++ b/client/src/app/user-profile/import-user-profile/import-user-profile.component.html @@ -1,7 +1,7 @@

- - submit + + {{'submit'|translate}}

- Syncing... + {{'Syncing'|translate}}...

diff --git a/client/src/app/user-profile/import-user-profile/import-user-profile.component.ts b/client/src/app/user-profile/import-user-profile/import-user-profile.component.ts index d4302c4448..a88533c083 100644 --- a/client/src/app/user-profile/import-user-profile/import-user-profile.component.ts +++ b/client/src/app/user-profile/import-user-profile/import-user-profile.component.ts @@ -5,6 +5,7 @@ import { Router } from '@angular/router'; import PouchDB from 'pouchdb'; import { AppConfigService } from 'src/app/shared/_services/app-config.service'; import { AppConfig } from 'src/app/shared/_classes/app-config.class'; +import { _TRANSLATE } from 'src/app/shared/translation-marker'; @Component({ diff --git a/translations/translation.en.json b/translations/translation.en.json index 53af74dd3c..10dbcac72a 100644 --- a/translations/translation.en.json +++ b/translations/translation.en.json @@ -97,6 +97,7 @@ "Edit Item": "Edit Item", "Email": "Email", "End Date": "End Date", + "Enter the provided import code": "Enter the provided import code", "Enter your response to above question here": "Enter your response to above question here", "Error Downloading File": "Error Downloading File", "Error restoring db ": "Error restoring db ", @@ -253,6 +254,7 @@ "START": "START", "STOP": "STOP", "SUBMIT": "SUBMIT", + "SYNCING": "SYNCING", "SYNC DATA FOR ALL USERS": "SYNC DATA FOR ALL USERS", "Save": "Save", "Save before switching or your changes will be deleted.": "Save before switching or your changes will be deleted.", diff --git a/translations/translation.es_gt.json b/translations/translation.es_gt.json index 6259c1321a..087b0413b2 100755 --- a/translations/translation.es_gt.json +++ b/translations/translation.es_gt.json @@ -97,6 +97,7 @@ "Edit Item": "Editar elemento", "Email": "Correo electrónico", "End Date": "End Date", + "Enter the provided import code": "Introduzca el código de importación", "Enter your response to above question here": "Escriba aquí su respuesta a la pregunta anterior", "Error Downloading File": "Error al descargar el archivo", "Error restoring db ": "Error restoring db ", @@ -433,6 +434,7 @@ "start form": "Iniciar formulario", "submit": "Guardar", "summary": "resumen", + "syncing": "sincronización", "updated settings": "updated settings", "yes": "yes", "yes, continue": "sí, continuar", From 5b837a98a138a3777dbf609247798fece360d2a9 Mon Sep 17 00:00:00 2001 From: esurface Date: Wed, 7 Feb 2024 12:28:39 -0500 Subject: [PATCH 43/43] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b22cdaeee..0456c4e0a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ __New Features__ __General Updates__ - Password Visibility -- the login and register screen on the client shows an 'eye' icon used to hide or show passwords - Re-organization of the client app menu +- Reintroduce `registrationRequiresServerUser` app config setting to make managing central user more flexible + - use `registrationRequiresServerUser` to require an import code when registering users on the client + - use `centrallyManagedUserProfile` to require an import code AND only allow changes to the user profile on the server + - use `hideProfile` to hide the manage user profile page from on the client __Teach Module Updates__ - Behavior screen show a link instead of a checkbox to access the Behavior form