From 2616d82172e7c2e6fbc55033079320a2a270bd30 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Tue, 3 Dec 2024 14:10:56 +1100 Subject: [PATCH 1/7] feat(visitor-kiosk): add translation hooks for text in visitor kiosk (PPT-1720) --- .../src/app/bootstrap.component.ts | 55 ++++++++++++++----- .../app/checkin/checkin-details.component.ts | 44 ++++++++++----- .../app/checkin/checkin-error.component.ts | 4 +- .../checkin/checkin-induction.component.ts | 8 +-- .../app/checkin/checkin-photo.component.ts | 8 ++- .../checkin/checkin-preferences.component.ts | 17 ++++-- .../app/checkin/checkin-qr-scan.component.ts | 14 +++-- .../app/checkin/checkin-result.component.ts | 10 ++-- .../src/app/checkin/checkin-state.service.ts | 29 ++++------ .../src/app/visitor-registration.component.ts | 35 ++++++++---- .../src/app/welcome.component.ts | 28 +++++----- libs/common/src/index.ts | 1 + libs/common/src/lib/translate.ts | 12 ++++ libs/components/src/lib/app.component.ts | 2 + shared/assets/locale/en.json | 52 +++++++++++++++++- 15 files changed, 224 insertions(+), 95 deletions(-) create mode 100644 libs/common/src/lib/translate.ts diff --git a/apps/visitor-kiosk/src/app/bootstrap.component.ts b/apps/visitor-kiosk/src/app/bootstrap.component.ts index 6281d3e613..7933487927 100644 --- a/apps/visitor-kiosk/src/app/bootstrap.component.ts +++ b/apps/visitor-kiosk/src/app/bootstrap.component.ts @@ -22,22 +22,33 @@ import { first } from 'rxjs/operators';
-
Visitor Kiosk
-
SETUP
+
{{ 'VISITOR_KIOSK.APP' | translate }}
+
+
+
+ {{ 'VISITOR_KIOSK.SETUP' | translate }} +
+
- +
@@ -75,14 +86,18 @@ import { first } from 'rxjs/operators'; - +
@@ -123,13 +138,17 @@ import { first } from 'rxjs/operators'; *ngIf="(levels | async)?.length && active_building" >
- +
@@ -169,13 +188,16 @@ import { first } from 'rxjs/operators';

Confirm Details

- + - The email address of your host is required + {{ 'VISITOR_KIOSK.EMAIL_REQUIRED' | translate }}
- + Please enter your full name
- + - A valid email address is required + {{ + 'VISITOR_KIOSK.EMAIL_REQUIRED' | translate + }}
- +
- +
- +
- Updating data and checking in... + {{ 'VISITOR_KIOSK.CHECKIN_LOADING' | translate }}
diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts index 104a01fd0e..e8423b4ef7 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-error.component.ts @@ -10,7 +10,9 @@ import { CheckinStateService } from './checkin-state.service';

Please see reception.

{{ error | async }}

Our staff at reception will assist you.

-
Back + + {{ 'VISITOR_KIOSK.CONFIRM' | translate }} +
`, styles: [ diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts index f4dff154f2..4cea078e49 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-induction.component.ts @@ -17,7 +17,7 @@ import { OrganisationService } from '@placeos/organisation'; class="relative bg-base-100 rounded shadow overflow-hidden flex flex-col items-center w-[32rem] p-4" >

- Please read the induction information below before proceeding + {{ 'VISITOR_KIOSK.INDUCTION_MSG' | translate }}

- I agree + {{ 'VISITOR_KIOSK.ACCEPT_TERMS' | translate }}
diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts index 7cc3289683..e1a7f1c993 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-photo.component.ts @@ -10,7 +10,9 @@ import { CheckinStateService } from './checkin-state.service'; class="bg-base-100 rounded shadow overflow-hidden relative flex flex-col items-center p-4" *ngIf="!loading; else load_state" > -

Take a photo to continue

+

+ {{ 'VISITOR_KIOSK.TAKE_PHOTO' | translate }} +

- Printing guest pass... + {{ 'VISITOR_KIOSK.PRINT_LOADING' | translate }}
@@ -56,7 +58,7 @@ export class CheckinPhotoComponent { constructor( private _checkin: CheckinStateService, - private _router: Router + private _router: Router, ) {} public async handlePhoto(event: any) { diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts index 56fdb42a70..19ac69b429 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-preferences.component.ts @@ -12,7 +12,9 @@ import { CheckinStateService } from './checkin-state.service';
-

Would you like a drink?

+

+ {{ 'VISITOR_KIOSK.BEVERAGE_MSG' | translate }} +

_.toLowerCase() === 'drink' || _.toLowerCase() === 'drinks' || - _.toLowerCase() === 'beverage' - ) + _.toLowerCase() === 'beverage', + ), ); - }) + }), ); constructor( private _router: Router, private _checkin: CheckinStateService, - private _catering: CateringStateService + private _catering: CateringStateService, ) {} public async update() { diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts index c4872fdb73..2b4b4866cb 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-qr-scan.component.ts @@ -20,7 +20,7 @@ import { take } from 'rxjs/operators'; [class.hidden]="checking_code" >

- Please enter your email address or scan your QR code + {{ 'VISITOR_KIOSK.QR_CODE_MSG' | translate }}

- Invalid email format + {{ + 'VISITOR_KIOSK.INVALID_EMAIL' | translate + }}
videocam_off

- Camera feed loading or is not available + {{ 'VISITOR_KIOSK.CAMERA_UNAVAILABLE' | translate }}

`, styles: [ diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts b/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts index dc30c90f5b..e41df44e85 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-result.component.ts @@ -23,7 +23,9 @@ const DEFAULT_TEMPLATE = ` class="bg-base-100 rounded shadow overflow-hidden relative flex flex-col items-center w-[36rem] p-4 space-y-4" *ngIf="event | async" > -

You are checked in!

+

+ {{ 'VISITOR_KIOSK.CHECKED_IN_MSG' | translate }} +

- Visitor + {{ 'VISITOR_KIOSK.VISITOR' | translate }}
@@ -101,10 +103,10 @@ const DEFAULT_TEMPLATE = ` *ngIf="allow_printing_label" (click)="print()" > - Print Label + {{ 'VISITOR_KIOSK.PRINT_LABEL' | translate }}
diff --git a/apps/visitor-kiosk/src/app/checkin/checkin-state.service.ts b/apps/visitor-kiosk/src/app/checkin/checkin-state.service.ts index 1f5febccc0..0311988ce8 100644 --- a/apps/visitor-kiosk/src/app/checkin/checkin-state.service.ts +++ b/apps/visitor-kiosk/src/app/checkin/checkin-state.service.ts @@ -1,18 +1,17 @@ import { Injectable } from '@angular/core'; -import { HashMap, notifyError, notifySuccess } from '@placeos/common'; +import { HashMap, i18n, notifyError, notifySuccess } from '@placeos/common'; import { GuestUser, generateGuestForm, showGuest } from '@placeos/users'; -import { addMinutes, getUnixTime, isSameDay, startOfHour } from 'date-fns'; +import { addMinutes, getUnixTime, isSameDay } from 'date-fns'; import { BehaviorSubject } from 'rxjs'; import { Booking, checkinBooking, queryAllBookings, - setBookingState, showBooking, - updateBooking, updateBookingInductionStatus, } from '@placeos/bookings'; import { SpacePipe } from '@placeos/spaces'; +import { TranslatePipe } from '@ngx-translate/core'; @Injectable({ providedIn: 'root', @@ -94,7 +93,7 @@ export class CheckinStateService { ); todays_events.sort((a, b) => a.date - b.date); if (todays_events.length <= 0) { - throw new Error(`No meetings for guest "${email}" today`); + throw new Error(i18n('VISITOR_KIOSK.NOT_FOUND', { email })); } this._guest.next(guest); this._booking.next(todays_events[0]); @@ -132,20 +131,16 @@ export class CheckinStateService { const event = this._booking.getValue() || guest.extension_data.event; if (!guest || !event) return; const checkin_fn = checkinBooking(event.id, true).toPromise(); + const vars = { + guest: guest.name, + host: event.user_name || event.user_email, + }; const result = await checkin_fn.catch(async (e) => { - notifyError( - e || - `Error checking in ${guest.name} for ${ - event.user_name || event.user_email - }'s meeting.`, - ); + notifyError(e || i18n('VISITOR_KIOSK.ERROR_CHECKIN', vars)); }); if (!result) return; - notifySuccess( - `Successfully checked in ${guest.name} for ${ - event.user_name || event.user_email - }'s meeting`, - ); + + notifySuccess(i18n('VISITOR_KIOSK.SUCCESS_CHECKIN', vars)); this.metadata = ''; } @@ -154,7 +149,7 @@ export class CheckinStateService { // TODO: actually trigger print visitor pass return new Promise((res) => setTimeout(() => res(''), 5000)); } catch (err) { - notifyError('Error printing visitor pass'); + notifyError(i18n('VISITOR_KIOSK.ERROR_PRINT')); } return Promise.reject(); } diff --git a/apps/visitor-kiosk/src/app/visitor-registration.component.ts b/apps/visitor-kiosk/src/app/visitor-registration.component.ts index 25d44994e9..f7f0729c97 100644 --- a/apps/visitor-kiosk/src/app/visitor-registration.component.ts +++ b/apps/visitor-kiosk/src/app/visitor-registration.component.ts @@ -3,6 +3,7 @@ import { Router } from '@angular/router'; import { BookingFormService } from '@placeos/bookings'; import { getInvalidFields, + i18n, notifyError, SettingsService, unique, @@ -33,30 +34,34 @@ import { OrganisationService } from '@placeos/organisation'; class="flex items-center justify-between space-x-4 px-4 py-2 border-b border-base-300" >

- Visitor Registration + {{ 'VISITOR_KIOSK.REGISTRATION' | translate }}

close
- + A valid email is required - + A valid email is required @@ -65,23 +70,29 @@ import { OrganisationService } from '@placeos/organisation'; formControlName="user" class="mb-4" > - + - +
@@ -89,7 +100,7 @@ import { OrganisationService } from '@placeos/organisation'; class="flex justify-end px-4 py-2 space-x-4 border-t border-base-300" > @@ -150,7 +161,9 @@ export class VisitorRegistrationComponent { this.form.markAllAsTouched(); if (!this.form.valid) { return notifyError( - `Some fields are invalid. [${getInvalidFields(this.form).join(', ')}]`, + i18n('COMMON.INVALID_FIELDS', { + field_list: getInvalidFields(this.form).join(', '), + }), ); } const value = this.form.value; diff --git a/apps/visitor-kiosk/src/app/welcome.component.ts b/apps/visitor-kiosk/src/app/welcome.component.ts index 4820c8206d..469dd35b79 100644 --- a/apps/visitor-kiosk/src/app/welcome.component.ts +++ b/apps/visitor-kiosk/src/app/welcome.component.ts @@ -15,7 +15,11 @@ import { AsyncHandler, SettingsService } from '@placeos/common';

-
Check-in
+
+ {{ 'VISITOR_KIOSK.CHECK_IN' | translate }} +
chevron_right
@@ -37,7 +43,9 @@ import { AsyncHandler, SettingsService } from '@placeos/common'; *ngIf="can_register" >
-
Register
+
+ {{ 'VISITOR_KIOSK.REGISTER' | translate }} +
chevron_right
@@ -49,7 +57,9 @@ import { AsyncHandler, SettingsService } from '@placeos/common'; class="base w-40" >
-
Explore
+
+ {{ 'VISITOR_KIOSK.EXPLORE' | translate }} +
place
@@ -90,15 +100,7 @@ export class WelcomeComponent } public get welcome_message() { - return ( - this._settings.get('app.welcome_message') || - ` -

- Welcome to PlaceOS -

-

Self Service Kiosk

-` - ); + return this._settings.get('app.welcome_message'); } constructor( diff --git a/libs/common/src/index.ts b/libs/common/src/index.ts index 0fb54efc0b..0586be9121 100644 --- a/libs/common/src/index.ts +++ b/libs/common/src/index.ts @@ -9,3 +9,4 @@ export * from './lib/keep-alive.service'; export * from './lib/uploads.service'; export * from './lib/shorten.fn'; export * from './lib/fixed-device-helpers'; +export * from './lib/translate'; diff --git a/libs/common/src/lib/translate.ts b/libs/common/src/lib/translate.ts new file mode 100644 index 0000000000..72b7a14b2f --- /dev/null +++ b/libs/common/src/lib/translate.ts @@ -0,0 +1,12 @@ +import { TranslateService } from '@ngx-translate/core'; + +let _service: TranslateService; + +export function setTranslationService(pipe: TranslateService) { + _service = pipe; +} + +export function i18n(key: string, args: Record = {}) { + if (!_service) return key; + return _service.instant(key, args); +} diff --git a/libs/components/src/lib/app.component.ts b/libs/components/src/lib/app.component.ts index 25031e6135..85f162396c 100644 --- a/libs/components/src/lib/app.component.ts +++ b/libs/components/src/lib/app.component.ts @@ -33,6 +33,7 @@ import { isMobileSafari, hasNewVersion, requestScreenWakeLock, + setTranslationService, } from '@placeos/common'; import { MapsPeopleService } from 'libs/common/src/lib/mapspeople.service'; import { OrganisationService } from 'libs/organisation/src/lib/organisation.service'; @@ -167,6 +168,7 @@ export class AppComponent extends AsyncHandler implements OnInit { } }); setNotifyOutlet(this._snackbar); + setTranslationService(this._translate); /** Wait for settings to initialise */ await this._settings.initialised.pipe(first((_) => _)).toPromise(); setAppName(this._settings.get('app.short_name')); diff --git a/shared/assets/locale/en.json b/shared/assets/locale/en.json index 2138de23a3..509624a2ca 100644 --- a/shared/assets/locale/en.json +++ b/shared/assets/locale/en.json @@ -6,7 +6,8 @@ "LANGUAGE_LABEL": "Language", "CONTINUE": "Continue", "ORGANISATION": "Organization", - "FAVOURITES": "Favourites" + "FAVOURITES": "Favourites", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "DESKS": { "SHOW_FAVOURITES": "Only show favourite desks" @@ -121,5 +122,54 @@ "ATTENDEES": "Attendees", "NOTES": "Notes", "RECURRENCE": "Recurrence" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } From 1baaa887c1c81b756008215565931e042bfdf2a6 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Tue, 3 Dec 2024 15:01:13 +1100 Subject: [PATCH 2/7] chore: add new string keys to locale files --- shared/assets/locale/ar.json | 52 +++++++++++- shared/assets/locale/en-GB.json | 52 +++++++++++- shared/assets/locale/en-US.json | 52 +++++++++++- shared/assets/locale/es.json | 52 +++++++++++- shared/assets/locale/fr-CA.json | 136 ++++++++++++++++++++++++++++++++ shared/assets/locale/fr.json | 52 +++++++++++- shared/assets/locale/pt.json | 52 +++++++++++- 7 files changed, 442 insertions(+), 6 deletions(-) create mode 100644 shared/assets/locale/fr-CA.json diff --git a/shared/assets/locale/ar.json b/shared/assets/locale/ar.json index 095d6b3be9..da6b880598 100644 --- a/shared/assets/locale/ar.json +++ b/shared/assets/locale/ar.json @@ -6,7 +6,8 @@ "LANGUAGE_LABEL": "لغة", "CONTINUE": "يكمل", "ORGANISATION": "شركة", - "FAVOURITES": "المفضلة" + "FAVOURITES": "المفضلة", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "DESKS": { "SHOW_FAVOURITES": "إظهار المكاتب المفضلة فقط" @@ -117,5 +118,54 @@ "ATTENDEES": "الحضور", "NOTES": "ملاحظات", "RECURRENCE": "Recurrence" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } diff --git a/shared/assets/locale/en-GB.json b/shared/assets/locale/en-GB.json index 495b58129c..2d45a16226 100644 --- a/shared/assets/locale/en-GB.json +++ b/shared/assets/locale/en-GB.json @@ -6,7 +6,8 @@ "LANGUAGE_LABEL": "Language", "CONTINUE": "Continue", "ORGANISATION": "Organization", - "FAVOURITES": "Favourites" + "FAVOURITES": "Favourites", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "DESKS": { "SHOW_FAVOURITES": "Only show favourite desks" @@ -119,5 +120,54 @@ "ATTENDEES": "Attendees", "NOTES": "Notes", "RECURRENCE": "Recurrence" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } diff --git a/shared/assets/locale/en-US.json b/shared/assets/locale/en-US.json index a04ea98603..69dfe48f0f 100644 --- a/shared/assets/locale/en-US.json +++ b/shared/assets/locale/en-US.json @@ -6,7 +6,8 @@ "LANGUAGE_LABEL": "Language", "CONTINUE": "Continue", "ORGANISATION": "Organization", - "FAVOURITES": "Favorites" + "FAVOURITES": "Favorites", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "DESKS": { "SHOW_FAVOURITES": "Only show favorite desks" @@ -112,5 +113,54 @@ "TITLE_ERROR": "Meeting title is required.", "ATTENDEES": "Attendees", "NOTES": "Notes" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } diff --git a/shared/assets/locale/es.json b/shared/assets/locale/es.json index b49d7bb3e4..11187365fd 100644 --- a/shared/assets/locale/es.json +++ b/shared/assets/locale/es.json @@ -1,6 +1,7 @@ { "COMMON": { - "TODAY": "Today" + "TODAY": "Today", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "WPA": { "COLLEAGUES": "Colleagues", @@ -79,5 +80,54 @@ "TITLE_ERROR": "Meeting title is required.", "ATTENDEES": "Attendees", "NOTES": "Notes" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } diff --git a/shared/assets/locale/fr-CA.json b/shared/assets/locale/fr-CA.json new file mode 100644 index 0000000000..170d6a4459 --- /dev/null +++ b/shared/assets/locale/fr-CA.json @@ -0,0 +1,136 @@ +{ + "COMMON": { + "TODAY": "Today", + "LANGUAGE": "Français", + "LANGUAGE_SELECT": "Sélectionnez une langue", + "LANGUAGE_LABEL": "Langue", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" + }, + "WPA": { + "COLLEAGUES": "Colleagues", + "FAVOURITES": "Favourites", + "WELCOME_MESSAGE": "Hello {{ name }},", + "YOUR_BOOKINGS": "Your Bookings", + "VIEW_ALL": "View All", + "NO_UPCOMING_BOOKINGS": "You have no upcoming bookings", + "AVAILABLE_NOW": "Available Now", + "SPACES": "Spaces", + "NO_FREE_SPACES": "No free spaces", + "DESK": "Desk", + "DESKS": "Desks", + "ROOM": "Room", + "ROOMS": "Rooms", + "NO_FREE_ROOMS": "No free rooms", + "CREATE_MEETING": "Create Meeting", + "REMOVE_COLLEAGUE": "Remove Colleague", + "ADD": "Add", + "COLLEAGUES_EMPTY": "You have no colleagues added. Please select the \"Add\" button to get started.", + "COLLEAGUES_SEARCHING": "Searching users...", + "BOOK": "Book", + "VIEW_DETAILS": "View Details", + "DETAILS": "Details", + "FAVOURITES_REMOVE": "Remove Favourites", + "FAVOURITES_EMPTY": "You have no favorites hearted. To add a favorites heart any item from their respective booking pages.", + "SCHEDULE_EMPTY": "No events and bookings for", + "SCHEDULE_ROOM_FILTER": "Room and meeting invites", + "SCHEDULE_DESK_FILTER": "Desk bookings", + "SCHEDULE_PARKING_FILTER": "Car, Bike, Van and ACC bookings", + "SCHEDULE_VISITOR_FILTER": "Visitor Invites", + "SCHEDULE_CAT_FILTERS": "Category Filters", + "PARKING": "Parking", + "VISITORS": "Visitors", + "FILTERS": "Filters", + "FILTERS_APPLY": "Apply Filters", + "BOOKING_TYPES": "Booking Types", + "BOOK_MEETING_HEADING": "Meeting", + "AVAILABILITY": "Availability", + "CATERING": "Catering", + "ASSETS": "Assets", + "NOTES_INFO": "General information for attendees", + "CONFIRM_MEETING": "Confirm Meeting", + "CLEAR_FORM": "Form", + "BOOKING_CONFIRMED": "Booking Confirmed!", + "BOOKING_DONE_CONTINUE": "Great, thanks!" + }, + "PANEL": { + "ROOM_CAPACITY": "Room capacity", + "CHECKIN_INPUT": "Touch or scan to check-in", + "BOOKING_INPUT": "Touch or scan to book", + "END_INPUT": "Touch to end meeting", + "SCAN_QR_CODE": "Scan QR code to book this room or view details", + "NEXT": "Next", + "NOW": "Now", + "HOST": "Host:", + "MEETING_IN_PROGRESS": "is currently in progress", + "BOOK": "Book", + "SCHEDULE": "Schedule", + "FEATURES": "Features", + "LIGHTS_BLINDS": "Lights & Blinds", + "TV": "TV", + "CATERING": "Catering", + "HELP": "Help", + "CHECKIN": "Check-in", + "UPCOMING": "Upcoming" + }, + "FORM": { + "ALL_DAY": "All Day", + "HOST": "Host", + "DATE": "Date", + "DATE_ERROR": "Date and time must be in the future", + "START_TIME": "Start Time", + "END_TIME": "End Time", + "TITLE": "Add Title", + "TITLE_ERROR": "Meeting title is required.", + "ATTENDEES": "Attendees", + "NOTES": "Notes" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" + } +} diff --git a/shared/assets/locale/fr.json b/shared/assets/locale/fr.json index 5e181e7173..170d6a4459 100644 --- a/shared/assets/locale/fr.json +++ b/shared/assets/locale/fr.json @@ -3,7 +3,8 @@ "TODAY": "Today", "LANGUAGE": "Français", "LANGUAGE_SELECT": "Sélectionnez une langue", - "LANGUAGE_LABEL": "Langue" + "LANGUAGE_LABEL": "Langue", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "WPA": { "COLLEAGUES": "Colleagues", @@ -82,5 +83,54 @@ "TITLE_ERROR": "Meeting title is required.", "ATTENDEES": "Attendees", "NOTES": "Notes" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } diff --git a/shared/assets/locale/pt.json b/shared/assets/locale/pt.json index 18c241d5e6..597b8d9737 100644 --- a/shared/assets/locale/pt.json +++ b/shared/assets/locale/pt.json @@ -1,6 +1,7 @@ { "COMMON": { - "TODAY": "Today" + "TODAY": "Today", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" }, "WPA": { "COLLEAGUES": "Colleagues", @@ -93,5 +94,54 @@ "TITLE_ERROR": "Meeting title is required.", "ATTENDEES": "Attendees", "NOTES": "Notes" + }, + "VISITOR_KIOSK": { + "APP": "Visitor Kiosk", + "SETUP": "Setup", + "SELECT_REGION_MSG": "Select a region from the dropdown below", + "SELECT_REGION": "Select region", + "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Select a level from the dropdown below", + "SELECT_LEVEL": "Select level", + "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", + "SELECT_ORIENTATION": "Select orientation", + "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", + "SELECT_LOCATION": "Select location", + "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", + "CHECK_IN": "Check-in", + "VISITOR": "Visitor", + "REGISTER": "Register", + "REGISTRATION": "Visitor Registration", + "EXPLORE": "Explore", + "QR_CODE_MSG": "Please enter your email address or scan your QR code", + "NAME": "Name", + "EMAIL": "Email", + "INVALID_EMAIL": "Invalid email address", + "EMAIL_REQUIRED": "A valid email address is required", + "FIND_DETAILS": "Find Details", + "LOADING_DETAILS": "Loading visitor information...", + "CAMERA_UNAVAILABLE": "Camera feed loading...", + "HOST": "Host", + "PHONE": "Phone", + "ORGANISATION": "Organization", + "CHECKED_IN_MSG": "You are checked in!", + "TAKE_PHOTO": "Take a photo to continue", + "CONFIRM": "Done", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Printing guest pass...", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "I agree", + "ACCEPT": "Accept", + "DECLINE": "Decline", + "CHECKIN_LOADING": "Saving details and checking in...", + "CONTINUE": "Next", + "SAVE": "Save", + "BEVERAGE_MSG": "Would you like a drink?", + "ERROR_PRINT": "Error printing visitor pass", + "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", + "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", + "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" } } From 4cca32c09447485416c9948c38dea501652e3c5c Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Tue, 3 Dec 2024 21:13:39 +1100 Subject: [PATCH 3/7] chore: format i18n-tools.js --- tools/i18n-tools.js | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/tools/i18n-tools.js b/tools/i18n-tools.js index aa0ddd3a04..404123cc3b 100644 --- a/tools/i18n-tools.js +++ b/tools/i18n-tools.js @@ -15,7 +15,7 @@ function generate_i18nFiles(lang_list) { } catch {} fs.writeFileSync( `${dir}/${lang}.json`, - JSON.stringify(merge(json, file_json), undefined, 4) + JSON.stringify(merge(json, file_json), undefined, 4), ); } } @@ -36,7 +36,11 @@ function i18nFilesToCSV(outfile) { const obj = { key }; for (const lang of lang_list) { const value = getItemWithKeys(i18n_data[lang], key.split('.')); - obj[lang] = lang !== 'en' && value === getItemWithKeys(i18n_data.en, key.split('.')) ? '' : value; + obj[lang] = + lang !== 'en' && + value === getItemWithKeys(i18n_data.en, key.split('.')) + ? '' + : value || ''; } i18n_rows.push(obj); } @@ -49,18 +53,22 @@ function CSVToi18nFiles(infile) { const files = fs.readdirSync(dir); const csv_data = fs.readFileSync(infile); const i18n_rows = csvToJson(csv_data); - const lang_list = files.map(_ => _.replace('.json', '')); + const lang_list = files.map((_) => _.replace('.json', '')); const i18n_data = {}; - lang_list.forEach(k => i18n_data[k] = {}); + lang_list.forEach((k) => (i18n_data[k] = {})); for (const row of i18n_rows) { for (const lang of lang_list) { - setItemWithKeys(i18n_data[lang], row.key.split('.'), row[lang] || row.en); + setItemWithKeys( + i18n_data[lang], + row.key.split('.'), + row[lang] || row.en, + ); } } for (const lang of lang_list) { fs.writeFileSync( `${dir}/${lang}.json`, - JSON.stringify(i18n_data[lang], undefined, 4) + JSON.stringify(i18n_data[lang], undefined, 4), ); } } @@ -93,7 +101,6 @@ function getItemWithKeys(map, keys) { return null; } - /** * Set item in the nested object * @param keys List of sub-keys to search for @@ -101,11 +108,10 @@ function getItemWithKeys(map, keys) { */ function setItemWithKeys(map, keys, value) { const key = keys[0]; - if (keys.length > 1){ + if (keys.length > 1) { if (!(key in map)) map[key] = {}; setItemWithKeys(map, keys.slice(1), value); - } - else map[key] = value; + } else map[key] = value; } /** @@ -118,7 +124,9 @@ function jsonToCsv(json, delimiter = '\t') { const valid_keys = keys.filter((key) => key in json[0]); return `${valid_keys.join(delimiter)}\n${json .map((item) => - valid_keys.map((key) => JSON.stringify(item[key])).join(delimiter) + valid_keys + .map((key) => JSON.stringify(item[key])) + .join(delimiter), ) .join('\n')}`; } @@ -132,7 +140,7 @@ function jsonToCsv(json, delimiter = '\t') { function csvToJson(csv, delimiter = ',') { const objPattern = new RegExp( '(\\,|\\r?\\n|\\r|^)(?:"([^"]*(?:""[^"]*)*)"|([^\\,\\r\\n]*))', - 'gi' + 'gi', ); let arrMatches = null; const arrData = [[]]; @@ -141,7 +149,7 @@ function csvToJson(csv, delimiter = ',') { arrData[arrData.length - 1].push( arrMatches[2] ? arrMatches[2].replace(new RegExp('""', 'g'), '"') - : arrMatches[3] + : arrMatches[3], ); } const headers = arrData.splice(0, 1)[0]; @@ -154,7 +162,7 @@ function csvToJson(csv, delimiter = ',') { } catch (e) { element[key] = row[i] || ''; } - if (element[key] === 'TRUE' || element[key] === 'FALSE') + if (element[key] === 'TRUE' || element[key] === 'FALSE') element[key] = element[key] === 'TRUE'; } return element; @@ -162,7 +170,7 @@ function csvToJson(csv, delimiter = ',') { return elements; } -switch(process.argv[2]) { +switch (process.argv[2]) { case 'to-csv': i18nFilesToCSV(process.argv[3]); break; @@ -170,6 +178,10 @@ switch(process.argv[2]) { CSVToi18nFiles(process.argv[3]); break; default: - generate_i18nFiles(process.argv[3] ? process.argv[3].split(',') : ['es', 'fr', 'pt']); + generate_i18nFiles( + process.argv[3] + ? process.argv[3].split(',') + : ['es', 'fr', 'pt', 'fr-CA'], + ); break; } From 00cfa2f4516324b51728068adfd18e0ae4fd4c63 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Wed, 4 Dec 2024 10:56:46 +1100 Subject: [PATCH 4/7] chore(locale): add various translations --- shared/assets/locale/ar.json | 86 ++++++++-------- shared/assets/locale/fr-CA.json | 74 +++++++------- shared/assets/locale/it.json | 175 ++++++++++++++++++++++++++++++++ shared/assets/locale/zh.json | 175 ++++++++++++++++++++++++++++++++ 4 files changed, 430 insertions(+), 80 deletions(-) create mode 100644 shared/assets/locale/it.json create mode 100644 shared/assets/locale/zh.json diff --git a/shared/assets/locale/ar.json b/shared/assets/locale/ar.json index da6b880598..d6f462013d 100644 --- a/shared/assets/locale/ar.json +++ b/shared/assets/locale/ar.json @@ -120,52 +120,52 @@ "RECURRENCE": "Recurrence" }, "VISITOR_KIOSK": { - "APP": "Visitor Kiosk", - "SETUP": "Setup", - "SELECT_REGION_MSG": "Select a region from the dropdown below", - "SELECT_REGION": "Select region", - "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "APP": "كشك الزوار", + "SETUP": "الإعداد", + "SELECT_REGION_MSG": "اختر منطقة من القائمة المنسدلة أدناه", + "SELECT_REGION": "اختر منطقة", + "SELECT_BUILDING_MSG": "اختر مبنى من القائمة المنسدلة أدناه", "SELECT_BUILDING": "Select building", - "SELECT_LEVEL_MSG": "Select a level from the dropdown below", - "SELECT_LEVEL": "Select level", - "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", - "SELECT_ORIENTATION": "Select orientation", - "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", - "SELECT_LOCATION": "Select location", - "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", - "CHECK_IN": "Check-in", - "VISITOR": "Visitor", - "REGISTER": "Register", - "REGISTRATION": "Visitor Registration", - "EXPLORE": "Explore", - "QR_CODE_MSG": "Please enter your email address or scan your QR code", - "NAME": "Name", - "EMAIL": "Email", - "INVALID_EMAIL": "Invalid email address", - "EMAIL_REQUIRED": "A valid email address is required", - "FIND_DETAILS": "Find Details", - "LOADING_DETAILS": "Loading visitor information...", - "CAMERA_UNAVAILABLE": "Camera feed loading...", - "HOST": "Host", - "PHONE": "Phone", - "ORGANISATION": "Organization", - "CHECKED_IN_MSG": "You are checked in!", - "TAKE_PHOTO": "Take a photo to continue", - "CONFIRM": "Done", - "PRINT_LABEL": "Print Label", - "PRINT_LOADING": "Printing guest pass...", + "SELECT_LEVEL_MSG": "اختر مستوى من القائمة المنسدلة أدناه", + "SELECT_LEVEL": "اختر مستوى", + "SELECT_ORIENTATION_MSG": "اختر اتجاهًا من القائمة المنسدلة أدناه", + "SELECT_ORIENTATION": "اختر اتجاهًا", + "SELECT_LOCATION_MSG": "اختر موقعًا ثابتًا من القائمة المنسدلة أدناه", + "SELECT_LOCATION": "اختر موقعًا", + "WELCOME_MESSAGE": "أهلاً بك في نقطة الخدمة الذاتية من PlaceOS", + "CHECK_IN": "تسجيل الدخول", + "VISITOR": "زائر", + "REGISTER": "تسجيل", + "REGISTRATION": "تسجيل الزوار", + "EXPLORE": "استكشاف", + "QR_CODE_MSG": "يرجى إدخال عنوان بريدك الإلكتروني أو مسح رمز الاستجابة السريعة الخاص بك", + "NAME": "الاسم", + "EMAIL": "البريد الإلكتروني", + "INVALID_EMAIL": "عنوان بريد إلكتروني غير صالح", + "EMAIL_REQUIRED": "مطلوب عنوان بريد إلكتروني صالح", + "FIND_DETAILS": "ابحث عن التفاصيل", + "LOADING_DETAILS": "جارٍ تحميل معلومات الزوار", + "CAMERA_UNAVAILABLE": "جارٍ تحميل بث الكاميرا", + "HOST": "المضيف", + "PHONE": "رقم الهاتف", + "ORGANISATION": "المنظمة/الشركة", + "CHECKED_IN_MSG": "أنت مسجل دخول!", + "TAKE_PHOTO": "التقط صورة للمتابعة", + "CONFIRM": "تم", + "PRINT_LABEL": "طباعة الملصق", + "PRINT_LOADING": "جارٍ طباعة بطاقة الزائر", "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", "INDUCTION_MSG": "Please read the induction information below before proceeding", - "ACCEPT_TERMS": "I agree", - "ACCEPT": "Accept", - "DECLINE": "Decline", - "CHECKIN_LOADING": "Saving details and checking in...", - "CONTINUE": "Next", + "ACCEPT_TERMS": "أوافق", + "ACCEPT": "قبول", + "DECLINE": "رفض", + "CHECKIN_LOADING": "جارٍ حفظ التفاصيل وتسجيل الدخول", + "CONTINUE": "التالي", "SAVE": "Save", - "BEVERAGE_MSG": "Would you like a drink?", - "ERROR_PRINT": "Error printing visitor pass", - "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", - "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", - "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" + "BEVERAGE_MSG": "هل ترغب في تناول مشروب؟", + "ERROR_PRINT": "خطأ أثناء طباعة بطاقة الزائر", + "ERROR_CHECKIN": "خطأ أثناء تسجيل {{ guest }} لاجتماع {{ host }}", + "SUCCESS_CHECKIN": "تم تسجيل {{ guest }} بنجاح لاجتماع {{ host }}", + "NOT_FOUND": "لا توجد اجتماعات للزائر {{ email }} اليوم" } } diff --git a/shared/assets/locale/fr-CA.json b/shared/assets/locale/fr-CA.json index 170d6a4459..02cbefd115 100644 --- a/shared/assets/locale/fr-CA.json +++ b/shared/assets/locale/fr-CA.json @@ -85,52 +85,52 @@ "NOTES": "Notes" }, "VISITOR_KIOSK": { - "APP": "Visitor Kiosk", - "SETUP": "Setup", - "SELECT_REGION_MSG": "Select a region from the dropdown below", - "SELECT_REGION": "Select region", - "SELECT_BUILDING_MSG": "Select a building from the dropdown below", + "APP": "Kiosque Visiteur", + "SETUP": "Configuration", + "SELECT_REGION_MSG": "Sélectionnez une région dans le menu déroulant ci-dessous", + "SELECT_REGION": "Sélectionner une région", + "SELECT_BUILDING_MSG": "Sélectionnez un bâtiment dans le menu déroulant ci-dessous", "SELECT_BUILDING": "Select building", - "SELECT_LEVEL_MSG": "Select a level from the dropdown below", - "SELECT_LEVEL": "Select level", - "SELECT_ORIENTATION_MSG": "Select an orientation from the dropdown below", - "SELECT_ORIENTATION": "Select orientation", - "SELECT_LOCATION_MSG": "Select a fixed location from the dropdown below", - "SELECT_LOCATION": "Select location", - "WELCOME_MESSAGE": "

Welcome to PlaceOS

Self Service Kiosk

", - "CHECK_IN": "Check-in", - "VISITOR": "Visitor", - "REGISTER": "Register", - "REGISTRATION": "Visitor Registration", - "EXPLORE": "Explore", - "QR_CODE_MSG": "Please enter your email address or scan your QR code", - "NAME": "Name", + "SELECT_LEVEL_MSG": "Sélectionnez un niveau dans le menu déroulant ci-dessous", + "SELECT_LEVEL": "Sélectionner un niveau", + "SELECT_ORIENTATION_MSG": "Sélectionnez une orientation dans le menu déroulant ci-dessous", + "SELECT_ORIENTATION": "Sélectionner une orientation", + "SELECT_LOCATION_MSG": "Sélectionnez un emplacement fixe dans le menu déroulant ci-dessous", + "SELECT_LOCATION": "Sélectionner un emplacement", + "WELCOME_MESSAGE": "Bienvenue à PlaceOS,
le kiosque libre-service", + "CHECK_IN": "Enregistrement", + "VISITOR": "Visiteur", + "REGISTER": "S'inscrire", + "REGISTRATION": "Enregistrement des visiteurs.", + "EXPLORE": "Explorer", + "QR_CODE_MSG": "Veuillez entrer votre adresse e-mail ou scanner votre code QR", + "NAME": "Nom", "EMAIL": "Email", - "INVALID_EMAIL": "Invalid email address", - "EMAIL_REQUIRED": "A valid email address is required", - "FIND_DETAILS": "Find Details", - "LOADING_DETAILS": "Loading visitor information...", - "CAMERA_UNAVAILABLE": "Camera feed loading...", - "HOST": "Host", + "INVALID_EMAIL": "Adresse e-mail invalide", + "EMAIL_REQUIRED": "Une adresse e-mail valide est requise", + "FIND_DETAILS": "Rechercher des détails", + "LOADING_DETAILS": "Chargement des informations des visiteurs", + "CAMERA_UNAVAILABLE": "Chargement du flux de la caméra", + "HOST": "Hôte", "PHONE": "Phone", "ORGANISATION": "Organization", "CHECKED_IN_MSG": "You are checked in!", - "TAKE_PHOTO": "Take a photo to continue", + "TAKE_PHOTO": "Prenez une photo pour continuer", "CONFIRM": "Done", "PRINT_LABEL": "Print Label", - "PRINT_LOADING": "Printing guest pass...", + "PRINT_LOADING": "Impression du badge visiteur", "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", "INDUCTION_MSG": "Please read the induction information below before proceeding", - "ACCEPT_TERMS": "I agree", - "ACCEPT": "Accept", - "DECLINE": "Decline", - "CHECKIN_LOADING": "Saving details and checking in...", - "CONTINUE": "Next", + "ACCEPT_TERMS": "Je suis d'accord", + "ACCEPT": "Accepter", + "DECLINE": "Refuser", + "CHECKIN_LOADING": "Enregistrement des détails et vérification en cours", + "CONTINUE": "Suivant", "SAVE": "Save", - "BEVERAGE_MSG": "Would you like a drink?", - "ERROR_PRINT": "Error printing visitor pass", - "ERROR_CHECKIN": "Error checking in {{ guest }} for {{ host }}'s meeting.", - "SUCCESS_CHECKIN": "Successfully checked in {{ guest }} for {{ host }}'s meeting", - "NOT_FOUND": "No meetings for guest \"{{ email }}\" today" + "BEVERAGE_MSG": "Souhaitez-vous une boisson?", + "ERROR_PRINT": "Erreur lors de l'impression du badge visiteur", + "ERROR_CHECKIN": "Erreur lors de l'enregistrement de {{ guest }} pour la réunion de {{ host }}", + "SUCCESS_CHECKIN": "Enregistrement réussi de {{ guest }} pour la réunion de {{ host }}", + "NOT_FOUND": "Pas de réunions pour le visiteur {{ email }} aujourd'hui" } } diff --git a/shared/assets/locale/it.json b/shared/assets/locale/it.json new file mode 100644 index 0000000000..f3b57ab9a9 --- /dev/null +++ b/shared/assets/locale/it.json @@ -0,0 +1,175 @@ +{ + "COMMON": { + "TODAY": "Today", + "LANGUAGE": "Italian", + "LANGUAGE_SELECT": "Select a language", + "LANGUAGE_LABEL": "Language", + "CONTINUE": "Continue", + "ORGANISATION": "Organization", + "FAVOURITES": "Favourites", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" + }, + "DESKS": { + "SHOW_FAVOURITES": "Only show favourite desks" + }, + "ROOMS": { + "SHOW_FAVOURITES": "Only show favourite rooms" + }, + "LOCKERS": { + "SHOW_FAVOURITES": "Only show favourite lockers" + }, + "WPA": { + "COLLEAGUES": "Colleagues", + "FAVOURITES": "Favourites", + "WELCOME_MESSAGE": "Hello {{ name }},", + "YOUR_BOOKINGS": "Your Bookings", + "VIEW_ALL": "View All", + "NO_UPCOMING_BOOKINGS": "No more upcoming events today", + "AVAILABLE_NOW": "Available Now", + "SPACES": "Spaces", + "NO_FREE_SPACES": "No desks are currently available", + "NO_FREE_ROOMS": "No meeting rooms are currently available", + "DESK": "Desk", + "DESKS": "Desks", + "ROOM": "Room", + "ROOMS": "Rooms", + "LOCKER": "Locker", + "LOCKERS": "Lockers", + "GROUP_EVENT": "Event", + "GROUP_EVENTS": "Events", + "CREATE_MEETING": "Create Meeting", + "REMOVE_COLLEAGUE": "Remove Colleague", + "ADD": "Add", + "COLLEAGUES_EMPTY": "You have no colleagues added. Please select the \"Add\" button to get started.", + "COLLEAGUES_SEARCHING": "Searching users...", + "BOOK": "Book", + "VIEW_DETAILS": "View Details", + "DETAILS": "Details", + "FAVOURITES_REMOVE": "Remove Favourites", + "FAVOURITES_EMPTY": "You have no favorites hearted. To add a favorites heart any item from their respective booking pages.", + "SCHEDULE_EMPTY": "No events and bookings for", + "SCHEDULE_ROOM_FILTER": "Room and meeting invites", + "SCHEDULE_DESK_FILTER": "Desk bookings", + "SCHEDULE_PARKING_FILTER": "Car, Bike, Van and ACC bookings", + "SCHEDULE_VISITOR_FILTER": "Visitor Invites", + "SCHEDULE_CAT_FILTERS": "Category Filters", + "SCHEDULE_LOCKER_FILTER": "Lockers and Storage", + "SCHEDULE_GROUP_EVENT_FILTER": "Organization Events", + "PARKING": "Parking", + "VISITORS": "Visitors", + "FILTERS": "Filters", + "FILTERS_APPLY": "Apply Filters", + "BOOKING_TYPES": "Booking Types", + "BOOK_MEETING_HEADING": "Meeting", + "AVAILABILITY": "Availability", + "CATERING": "Catering", + "ASSETS": "Assets", + "NOTES_INFO": "General information for attendees", + "CONFIRM_MEETING": "Confirm Meeting", + "CLEAR_FORM": "Form", + "BOOKING_CONFIRMED": "Booking Confirmed!", + "BOOKING_DONE_CONTINUE": "Great, thanks!", + "RESOURCE_CHECKED_IN": "Successfully checked-in", + "RESOURCE_CHECKED_IN_FAILED": "Check-in failed!", + "CHECKED_IN": "Your event has been successfully checked in.", + "TRY_AGAIN": "Try again" + }, + "PANEL": { + "ROOM_CAPACITY": "Room capacity", + "CHECKIN_INPUT": "Touch or scan to check-in", + "BOOKING_INPUT": "Touch or scan to book", + "END_INPUT": "Touch to end meeting", + "SCAN_QR_CODE": "Scan QR code to book this room or view details", + "NEXT": "Next", + "NOW": "Now", + "HOST": "Host:", + "MEETING_IN_PROGRESS": "is currently in progress", + "BOOK": "Book", + "SCHEDULE": "Schedule", + "FEATURES": "Features", + "LIGHTS_BLINDS": "Lights & Blinds", + "TV": "TV", + "CATERING": "Catering", + "HELP": "Help", + "CHECKIN": "Check-in", + "UPCOMING": "Upcoming", + "NO_CURRENT": "No current events", + "NO_UPCOMING": "No upcoming events", + "BOOTSTRAP_TITLE": "PlaceOS Booking Panel", + "BOOTSTRAP_DESCRIPTION": "Input the PlaceOS System ID to bootstrap", + "BOOTSTRAP_LABEL": "System ID", + "BOOTSTRAP_INPUT_PLACEHOLDER": "Start typing to search for a room", + "LOADING_SYSTEM": "Loading system data...", + "FREE_IN_HOURS_AND_MINUTES": "Free in {{ hour }} hours and {{ minute }} minutes", + "FREE_IN_MINUTES": "Free in {{ minute }} minutes", + "FREE_IN_LESS_THAN_MINUTE": "Free in less than a minute", + "FREE_FOR_HOURS_AND_MINUTES": "Free for {{ hour }} hours and {{ minute }} minutes", + "FREE_FOR_MINUTES": "Free for {{ minute }} minutes", + "FREE_FOR_LESS_THAN_MINUTE": "Free for less than a minute", + "EARLY_CHECKIN": "Meeting has been checked in early", + "NO_MESSAGES": "No messages" + }, + "FORM": { + "ALL_DAY": "All Day", + "HOST": "Host", + "DATE": "Date", + "END_DATE": "End Date", + "DATE_ERROR": "Date and time must be in the future", + "START_TIME": "Start Time", + "END_TIME": "End Time", + "TITLE": "Add Title", + "TITLE_ERROR": "Meeting title is required.", + "ATTENDEES": "Attendees", + "NOTES": "Notes", + "RECURRENCE": "Recurrence" + }, + "VISITOR_KIOSK": { + "APP": "Chiosco Visitatori", + "SETUP": "Impostare", + "SELECT_REGION_MSG": "Seleziona una regione dal menu a discesa sottostante", + "SELECT_REGION": "Seleziona regione", + "SELECT_BUILDING_MSG": "Seleziona un edificio dal menu a discesa sottostante", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "Seleziona un livello dal menu a discesa sottostante", + "SELECT_LEVEL": "Seleziona il livello", + "SELECT_ORIENTATION_MSG": "Seleziona un orientamento dal menu a discesa sottostante", + "SELECT_ORIENTATION": "Seleziona l'orientamento", + "SELECT_LOCATION_MSG": "Seleziona una posizione fissa dal menu a discesa sottostante", + "SELECT_LOCATION": "Seleziona la posizione", + "WELCOME_MESSAGE": "Benvenuto nel chiosco self-service PlaceOS", + "CHECK_IN": "Check-in", + "VISITOR": "Visitatore", + "REGISTER": "Registro", + "REGISTRATION": "Registrazione dei visitatori", + "EXPLORE": "Esplorare", + "QR_CODE_MSG": "Inserisci il tuo indirizzo email o scansiona il tuo codice QR", + "NAME": "Nome", + "EMAIL": "E-mail", + "INVALID_EMAIL": "Indirizzo e-mail non valido", + "EMAIL_REQUIRED": "È richiesto un indirizzo email valido", + "FIND_DETAILS": "Trova i dettagli", + "LOADING_DETAILS": "Caricamento delle informazioni sui visitatori", + "CAMERA_UNAVAILABLE": "Caricamento del feed della fotocamera", + "HOST": "Ospite", + "PHONE": "Numero di telefono", + "ORGANISATION": "Organizzazione/Azienda", + "CHECKED_IN_MSG": "Hai effettuato il check-in!", + "TAKE_PHOTO": "Scatta una foto per continuare", + "CONFIRM": "Fatto", + "PRINT_LABEL": "Print Label", + "PRINT_LOADING": "Stampa del pass ospite", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "Sono d'accordo", + "ACCEPT": "Accettare", + "DECLINE": "Declino", + "CHECKIN_LOADING": "Salvataggio dei dettagli e check-in", + "CONTINUE": "Prossimo", + "SAVE": "Save", + "BEVERAGE_MSG": "Vuoi da bere?", + "ERROR_PRINT": "Errore durante la stampa del pass visitatore", + "ERROR_CHECKIN": "Errore durante il check-in di {{ guest }} per la riunione di {{ host }}", + "SUCCESS_CHECKIN": "Ha effettuato il check-in di {{ guest }} per la riunione di {{ host }} con successo", + "NOT_FOUND": "Nessuna riunione per l'ospite {{ email }} oggi" + } +} diff --git a/shared/assets/locale/zh.json b/shared/assets/locale/zh.json new file mode 100644 index 0000000000..7bad0a6823 --- /dev/null +++ b/shared/assets/locale/zh.json @@ -0,0 +1,175 @@ +{ + "COMMON": { + "TODAY": "Today", + "LANGUAGE": "English", + "LANGUAGE_SELECT": "Select a language", + "LANGUAGE_LABEL": "Language", + "CONTINUE": "Continue", + "ORGANISATION": "Organization", + "FAVOURITES": "Favourites", + "INVALID_FIELDS": "Some fields are invalid. [{{ field_list }}]" + }, + "DESKS": { + "SHOW_FAVOURITES": "Only show favourite desks" + }, + "ROOMS": { + "SHOW_FAVOURITES": "Only show favourite rooms" + }, + "LOCKERS": { + "SHOW_FAVOURITES": "Only show favourite lockers" + }, + "WPA": { + "COLLEAGUES": "Colleagues", + "FAVOURITES": "Favourites", + "WELCOME_MESSAGE": "Hello {{ name }},", + "YOUR_BOOKINGS": "Your Bookings", + "VIEW_ALL": "View All", + "NO_UPCOMING_BOOKINGS": "No more upcoming events today", + "AVAILABLE_NOW": "Available Now", + "SPACES": "Spaces", + "NO_FREE_SPACES": "No desks are currently available", + "NO_FREE_ROOMS": "No meeting rooms are currently available", + "DESK": "Desk", + "DESKS": "Desks", + "ROOM": "Room", + "ROOMS": "Rooms", + "LOCKER": "Locker", + "LOCKERS": "Lockers", + "GROUP_EVENT": "Event", + "GROUP_EVENTS": "Events", + "CREATE_MEETING": "Create Meeting", + "REMOVE_COLLEAGUE": "Remove Colleague", + "ADD": "Add", + "COLLEAGUES_EMPTY": "You have no colleagues added. Please select the \"Add\" button to get started.", + "COLLEAGUES_SEARCHING": "Searching users...", + "BOOK": "Book", + "VIEW_DETAILS": "View Details", + "DETAILS": "Details", + "FAVOURITES_REMOVE": "Remove Favourites", + "FAVOURITES_EMPTY": "You have no favorites hearted. To add a favorites heart any item from their respective booking pages.", + "SCHEDULE_EMPTY": "No events and bookings for", + "SCHEDULE_ROOM_FILTER": "Room and meeting invites", + "SCHEDULE_DESK_FILTER": "Desk bookings", + "SCHEDULE_PARKING_FILTER": "Car, Bike, Van and ACC bookings", + "SCHEDULE_VISITOR_FILTER": "Visitor Invites", + "SCHEDULE_CAT_FILTERS": "Category Filters", + "SCHEDULE_LOCKER_FILTER": "Lockers and Storage", + "SCHEDULE_GROUP_EVENT_FILTER": "Organization Events", + "PARKING": "Parking", + "VISITORS": "Visitors", + "FILTERS": "Filters", + "FILTERS_APPLY": "Apply Filters", + "BOOKING_TYPES": "Booking Types", + "BOOK_MEETING_HEADING": "Meeting", + "AVAILABILITY": "Availability", + "CATERING": "Catering", + "ASSETS": "Assets", + "NOTES_INFO": "General information for attendees", + "CONFIRM_MEETING": "Confirm Meeting", + "CLEAR_FORM": "Form", + "BOOKING_CONFIRMED": "Booking Confirmed!", + "BOOKING_DONE_CONTINUE": "Great, thanks!", + "RESOURCE_CHECKED_IN": "Successfully checked-in", + "RESOURCE_CHECKED_IN_FAILED": "Check-in failed!", + "CHECKED_IN": "Your event has been successfully checked in.", + "TRY_AGAIN": "Try again" + }, + "PANEL": { + "ROOM_CAPACITY": "Room capacity", + "CHECKIN_INPUT": "Touch or scan to check-in", + "BOOKING_INPUT": "Touch or scan to book", + "END_INPUT": "Touch to end meeting", + "SCAN_QR_CODE": "Scan QR code to book this room or view details", + "NEXT": "Next", + "NOW": "Now", + "HOST": "Host:", + "MEETING_IN_PROGRESS": "is currently in progress", + "BOOK": "Book", + "SCHEDULE": "Schedule", + "FEATURES": "Features", + "LIGHTS_BLINDS": "Lights & Blinds", + "TV": "TV", + "CATERING": "Catering", + "HELP": "Help", + "CHECKIN": "Check-in", + "UPCOMING": "Upcoming", + "NO_CURRENT": "No current events", + "NO_UPCOMING": "No upcoming events", + "BOOTSTRAP_TITLE": "PlaceOS Booking Panel", + "BOOTSTRAP_DESCRIPTION": "Input the PlaceOS System ID to bootstrap", + "BOOTSTRAP_LABEL": "System ID", + "BOOTSTRAP_INPUT_PLACEHOLDER": "Start typing to search for a room", + "LOADING_SYSTEM": "Loading system data...", + "FREE_IN_HOURS_AND_MINUTES": "Free in {{ hour }} hours and {{ minute }} minutes", + "FREE_IN_MINUTES": "Free in {{ minute }} minutes", + "FREE_IN_LESS_THAN_MINUTE": "Free in less than a minute", + "FREE_FOR_HOURS_AND_MINUTES": "Free for {{ hour }} hours and {{ minute }} minutes", + "FREE_FOR_MINUTES": "Free for {{ minute }} minutes", + "FREE_FOR_LESS_THAN_MINUTE": "Free for less than a minute", + "EARLY_CHECKIN": "Meeting has been checked in early", + "NO_MESSAGES": "No messages" + }, + "FORM": { + "ALL_DAY": "All Day", + "HOST": "接待人", + "DATE": "Date", + "END_DATE": "End Date", + "DATE_ERROR": "Date and time must be in the future", + "START_TIME": "Start Time", + "END_TIME": "End Time", + "TITLE": "Add Title", + "TITLE_ERROR": "Meeting title is required.", + "ATTENDEES": "Attendees", + "NOTES": "Notes", + "RECURRENCE": "Recurrence" + }, + "VISITOR_KIOSK": { + "APP": "访客自助服务", + "SETUP": "设置", + "SELECT_REGION_MSG": "从下拉菜单中选择区域", + "SELECT_REGION": "选择区域", + "SELECT_BUILDING_MSG": "从下拉菜单中选择办公楼", + "SELECT_BUILDING": "Select building", + "SELECT_LEVEL_MSG": "从下拉菜单中选择楼层", + "SELECT_LEVEL": "选择楼层", + "SELECT_ORIENTATION_MSG": "从下拉菜单中选择朝向", + "SELECT_ORIENTATION": "选择朝向", + "SELECT_LOCATION_MSG": "从下拉菜单中选择位置", + "SELECT_LOCATION": "选择位置", + "WELCOME_MESSAGE": "欢迎使用 PlaceOS 自助服务台", + "CHECK_IN": "签到", + "VISITOR": "访客", + "REGISTER": "登记", + "REGISTRATION": "访客登记", + "EXPLORE": "浏览", + "QR_CODE_MSG": "请输入您的电子邮件地址或扫描二维码", + "NAME": "姓名", + "EMAIL": "电子邮箱", + "INVALID_EMAIL": "无效的电子邮件地址", + "EMAIL_REQUIRED": "需要有效的电子邮件地址", + "FIND_DETAILS": "查找详细信息", + "LOADING_DETAILS": "加载访客信息中", + "CAMERA_UNAVAILABLE": "加载摄像头画面", + "HOST": "接待人", + "PHONE": "电话号码", + "ORGANISATION": "组织/公司", + "CHECKED_IN_MSG": "您已签到!", + "TAKE_PHOTO": "拍照继续", + "CONFIRM": "完成", + "PRINT_LABEL": "打印标签", + "PRINT_LOADING": "打印访客通行证", + "ARRIVED_MSG": "Your visitor \"{{ name }}\" has arrived and is waiting at reception", + "INDUCTION_MSG": "Please read the induction information below before proceeding", + "ACCEPT_TERMS": "我同意", + "ACCEPT": "接受", + "DECLINE": "拒绝", + "CHECKIN_LOADING": "保存信息并签到中", + "CONTINUE": "下一步", + "SAVE": "Save", + "BEVERAGE_MSG": "您需要饮料吗?", + "ERROR_PRINT": "打印访客通行证出错", + "ERROR_CHECKIN": "为{{ host }}的会议签到{{ guest }}时出错", + "SUCCESS_CHECKIN": "成功为{{ host }}的会议签到{{ guest }}", + "NOT_FOUND": "今天没有{{ email }}的访客会议" + } +} From f66f808b81cf1b690cf8351bd5103ef663c04c24 Mon Sep 17 00:00:00 2001 From: Alex Sorafumo Date: Wed, 4 Dec 2024 12:17:10 +1100 Subject: [PATCH 5/7] chore: remove old angular i18n tags --- .../src/app/bootstrap.component.ts | 31 +++++----- .../building-form.component.ts | 33 ++++------ .../src/app/events/event-manage.component.ts | 4 +- .../level-manager/level-modal.component.ts | 34 +++++------ .../parking/parking-user-modal.component.ts | 6 +- .../app/poi-manager/poi-modal.component.ts | 16 ++--- .../region-manager/region-modal.component.ts | 51 ++++++++-------- .../room-alert-modal.component.ts | 4 +- .../app/room-manager/room-modal.component.ts | 61 ++++++------------- .../app/url-management/url-modal.component.ts | 16 ++--- .../src/lib/catering-item-modal.component.ts | 3 +- .../src/lib/misconfigured.component.ts | 10 +-- 12 files changed, 105 insertions(+), 164 deletions(-) diff --git a/apps/assistant-panel/src/app/bootstrap.component.ts b/apps/assistant-panel/src/app/bootstrap.component.ts index 7b47b6ab45..e35d97c429 100644 --- a/apps/assistant-panel/src/app/bootstrap.component.ts +++ b/apps/assistant-panel/src/app/bootstrap.component.ts @@ -15,21 +15,21 @@ const SYS_ID_KEY = 'PLACEOS.ASSISTANT.system';
+ >
Assistant Panel
SETUP
-
-
- +
- + search
- + this._updateTimezoneList()) + this.form.valueChanges.subscribe(() => this._updateTimezoneList()), ); if (this.building) this.form.patchValue(this.building); } @@ -166,8 +158,8 @@ export class BuildingFormComponent extends AsyncHandler { if (!this.form.valid) { return notifyError( `Some form fields are invalid. [${getInvalidFields( - this.form - ).join(', ')}]` + this.form, + ).join(', ')}]`, ); } const data = this.form.getRawValue(); @@ -178,14 +170,13 @@ export class BuildingFormComponent extends AsyncHandler { tags: ['building'], name: `BLD ${authority().description} ${data.display_name}`, }; - const building = await (data.id - ? updateZone(data.id, body) - : addZone(body) + const building = await ( + data.id ? updateZone(data.id, body) : addZone(body) ) .toPromise() .catch((e) => { notifyError( - `Error saving building: ${e.message || e.error || e}` + `Error saving building: ${e.message || e.error || e}`, ); this.loading = false; this.loadingChange.emit(false); @@ -201,7 +192,7 @@ export class BuildingFormComponent extends AsyncHandler { const timezone = this.form?.value?.timezone || ''; this.timezones = TIMEZONES_IANA; this.filtered_timezones = this.timezones.filter((_) => - _.toLowerCase().includes(timezone.toLowerCase()) + _.toLowerCase().includes(timezone.toLowerCase()), ); } } diff --git a/apps/concierge/src/app/events/event-manage.component.ts b/apps/concierge/src/app/events/event-manage.component.ts index 3ac300c171..a5fe675711 100644 --- a/apps/concierge/src/app/events/event-manage.component.ts +++ b/apps/concierge/src/app/events/event-manage.component.ts @@ -204,9 +204,7 @@ const EMPTY = [];
- + search diff --git a/apps/concierge/src/app/level-manager/level-modal.component.ts b/apps/concierge/src/app/level-manager/level-modal.component.ts index db5c1ea931..78736aeaaa 100644 --- a/apps/concierge/src/app/level-manager/level-modal.component.ts +++ b/apps/concierge/src/app/level-manager/level-modal.component.ts @@ -31,7 +31,6 @@ import { addZone, authority, updateZone } from '@placeos/ts-client'; form.controls.parent_id.invalid && form.controls.parent_id.touched " - i18n="@@zoneLabel" > Building*: @@ -51,9 +50,7 @@ import { addZone, authority, updateZone } from '@placeos/ts-client';
- +
- + + private _dialog_ref: MatDialogRef, ) {} public async save() { if (!this.form.valid) { return notifyError( `Some form fields are invalid. [${getInvalidFields( - this.form - ).join(', ')}]` + this.form, + ).join(', ')}]`, ); } this.loading = true; const data: any = this.form.getRawValue(); data.tags = data.parking ? ['level', 'parking'] : ['level']; - const resp = await (data.id - ? updateZone(data.id, { - ...data, - name: `LEVEL ${authority().description} ${data.display_name}`, - }) - : addZone({ - ...data, - name: `LEVEL ${authority().description} ${data.display_name}`, - }) + const resp = await ( + data.id + ? updateZone(data.id, { + ...data, + name: `LEVEL ${authority().description} ${data.display_name}`, + }) + : addZone({ + ...data, + name: `LEVEL ${authority().description} ${data.display_name}`, + }) ) .toPromise() .catch(); diff --git a/apps/concierge/src/app/parking/parking-user-modal.component.ts b/apps/concierge/src/app/parking/parking-user-modal.component.ts index da5b2ea353..9ea9f8a9d3 100644 --- a/apps/concierge/src/app/parking/parking-user-modal.component.ts +++ b/apps/concierge/src/app/parking/parking-user-modal.component.ts @@ -99,11 +99,7 @@ import { ParkingUser } from './parking-state.service'; >
- + Deny User Parking Access
diff --git a/apps/concierge/src/app/poi-manager/poi-modal.component.ts b/apps/concierge/src/app/poi-manager/poi-modal.component.ts index c821ee0cb3..61abf0ea26 100644 --- a/apps/concierge/src/app/poi-manager/poi-modal.component.ts +++ b/apps/concierge/src/app/poi-manager/poi-modal.component.ts @@ -40,9 +40,7 @@ import { SelectPOIMapModalComponent } from './select-poi-map-modal.component'; [formGroup]="form" >
- + - +
- +
- +
- +
- + search + private _dialog_ref: MatDialogRef, ) { super(); } @@ -117,9 +113,9 @@ export class RegionModalComponent extends AsyncHandler { this.form.valueChanges.subscribe( ({ timezone }) => (this.filtered_timezones = this.timezones.filter((_) => - _.toLowerCase().includes(timezone.toLowerCase()) - )) - ) + _.toLowerCase().includes(timezone.toLowerCase()), + )), + ), ); } @@ -127,26 +123,27 @@ export class RegionModalComponent extends AsyncHandler { if (!this.form.valid) { return notifyError( `Some form fields are invalid. [${getInvalidFields( - this.form - ).join(', ')}]` + this.form, + ).join(', ')}]`, ); } const data: any = this.form.getRawValue(); data.tags = ['region']; this.loading = true; - const resp = await (data.id - ? updateZone(data.id, { - ...data, - name: `REGION ${authority().description} ${ - data.display_name - }`, - }) - : addZone({ - ...data, - name: `REGION ${authority().description} ${ - data.display_name - }`, - }) + const resp = await ( + data.id + ? updateZone(data.id, { + ...data, + name: `REGION ${authority().description} ${ + data.display_name + }`, + }) + : addZone({ + ...data, + name: `REGION ${authority().description} ${ + data.display_name + }`, + }) ) .toPromise() .catch(); @@ -158,7 +155,7 @@ export class RegionModalComponent extends AsyncHandler { const timezone = this.form?.value?.timezone || ''; this.timezones = TIMEZONES_IANA; this.filtered_timezones = this.timezones.filter((_) => - _.toLowerCase().includes(timezone.toLowerCase()) + _.toLowerCase().includes(timezone.toLowerCase()), ); } } diff --git a/apps/concierge/src/app/room-manager/room-alert-modal.component.ts b/apps/concierge/src/app/room-manager/room-alert-modal.component.ts index c80257ff1b..19bc7b2830 100644 --- a/apps/concierge/src/app/room-manager/room-alert-modal.component.ts +++ b/apps/concierge/src/app/room-manager/room-alert-modal.component.ts @@ -19,7 +19,7 @@ import { PlaceSystem, showMetadata, updateMetadata } from '@placeos/ts-client'; *ngIf="!loading; else load_state" [formGroup]="form" > - + None @@ -28,7 +28,7 @@ import { PlaceSystem, showMetadata, updateMetadata } from '@placeos/ts-client'; Closed - + @@ -264,7 +245,6 @@ import { FormControl, FormGroup } from '@angular/forms'; form.controls.features.invalid && form.controls.features.touched " - i18n="@@featuresLabel" > Features: @@ -290,7 +270,7 @@ import { FormControl, FormGroup } from '@angular/forms';
- +
- + , - private _org: OrganisationService + private _org: OrganisationService, ) { super(); } @@ -400,7 +380,7 @@ export class RoomModalComponent extends AsyncHandler { public async ngOnInit() { const { details } = await showMetadata( this._org.organisation.id, - 'settings' + 'settings', ).toPromise(); const overflow = getItemWithKeys(['events', 'overflow'], details) || {}; if (this._data.room.id && overflow[this._data.room.id]) { @@ -416,9 +396,9 @@ export class RoomModalComponent extends AsyncHandler { this.form.valueChanges.subscribe( ({ timezone }) => (this.filtered_timezones = this.timezones.filter((_) => - _.toLowerCase().includes(timezone.toLowerCase()) - )) - ) + _.toLowerCase().includes(timezone.toLowerCase()), + )), + ), ); } } @@ -462,7 +442,7 @@ export class RoomModalComponent extends AsyncHandler { const timezone = this.form?.value?.timezone || ''; this.timezones = TIMEZONES_IANA; this.filtered_timezones = this.timezones.filter((_) => - _.toLowerCase().includes(timezone.toLowerCase()) + _.toLowerCase().includes(timezone.toLowerCase()), ); } @@ -470,8 +450,8 @@ export class RoomModalComponent extends AsyncHandler { if (!this.form.valid) return notifyError( `Some form fields are invalid. [${getInvalidFields( - this.form - ).join(', ')}]` + this.form, + ).join(', ')}]`, ); if (!this.form.value.id) { this.form.patchValue({ @@ -490,7 +470,7 @@ export class RoomModalComponent extends AsyncHandler { const data = this.form.getRawValue(); const { details } = (await showMetadata( this._org.organisation.id, - 'settings' + 'settings', ).toPromise()) as any; const overflow = getItemWithKeys(['events', 'overflow'], details) || {}; overflow[data.id] = this.settings_form.value; @@ -504,11 +484,10 @@ export class RoomModalComponent extends AsyncHandler { }) .toPromise() .catch((e) => - notifyWarn('Unable to save room setup and breakdown times') + notifyWarn('Unable to save room setup and breakdown times'), ); - await (data.id - ? updateSystem(data.id, data) - : addSystem(data) + await ( + data.id ? updateSystem(data.id, data) : addSystem(data) ).toPromise(); this._dialog_ref.disableClose = false; this._dialog_ref.close(true); diff --git a/apps/concierge/src/app/url-management/url-modal.component.ts b/apps/concierge/src/app/url-management/url-modal.component.ts index c9431153b2..5de7eae151 100644 --- a/apps/concierge/src/app/url-management/url-modal.component.ts +++ b/apps/concierge/src/app/url-management/url-modal.component.ts @@ -34,9 +34,7 @@ import { take } from 'rxjs/operators'; [formGroup]="form" >
- + - +
- +