export default { //////////////////////////////// // Update the local cache // // async updateCache(editedTranslation) { //This function is only called if there is a requirement to refresh the local cache //either they just changed translations and saved it in user settings //or they just edited a translation and saved it in translation editor and it's also their own local translation if (editedTranslation) { //iterate the keys that are cached and set them from whatever is in editedTranslation for that key for (const [key, value] of Object.entries( window.$gz.store.state.translationText )) { const display = editedTranslation.translationItems.find( z => z.key == key ).display; window.$gz.store.commit("setTranslationText", { key: key, value: display }); } } else { //gather up the keys that are cached and fetch the latest and then replace them const needIt = []; Object.keys(window.$gz.store.state.translationText).forEach(z => { needIt.push(z); }); //fetch these keys const transData = await window.$gz.api.upsert( "translation/subset", needIt ); transData.data.forEach(function commitFetchedTranslationItemToStore( item ) { window.$gz.store.commit("setTranslationText", item); }); } }, get(key) { if (!key) { console.trace("translation.js::get, no translation key was presented"); return ""; } //no translation for Wiki if (key == "Wiki") { return "Wiki"; } if (!window.$gz.util.has(window.$gz.store.state.translationText, key)) { return "??" + key; } return window.$gz.store.state.translationText[key]; }, async cacheTranslations(keys, forceTranslationId) { return new Promise(async function fetchTranslationKeysFromServer(resolve) { // //step 1: build an array of keys that we don't have already //Note: this will ensure only unique keys go into the store so it's safe to call this with dupes as can happen //for example datatables have dynamic column names so they need to fetch on demand const needIt = []; for (let i = 0; i < keys.length; i++) { if ( !window.$gz.util.has(window.$gz.store.state.translationText, keys[i]) ) { needIt.push(keys[i]); } } if (needIt.length == 0) { return resolve(); } //step 2: get it let transData = null; if (forceTranslationId) { transData = await window.$gz.api.upsert( `translation/subset/${forceTranslationId}`, needIt ); } else { transData = await window.$gz.api.upsert("translation/subset", needIt); } transData.data.forEach(function commitFetchedTranslationItemToStore( item ) { window.$gz.store.commit("setTranslationText", item); }); return resolve(); }); }, //Keys that will always be required for any AyaNova work for any user coreKeys: [ //main nav options "Evaluate", "Home", "Dashboard", "Schedule", "MemoList", "ReviewList", "UserSettings", "SetLoginPassword", "NotifySubscriptionList", "UserPreferences", "Service", "CustomerList", "HeadOfficeList", "Contacts", "WorkOrderList", "WorkOrderItemList", "WorkOrderItemExpenseList", "WorkOrderItemLaborList", "WorkOrderItemLoanList", "WorkOrderItemPartList", "WorkOrderItemPartRequestList", "WorkOrderItemScheduledUserList", "WorkOrderItemTravelList", "WorkOrderItemUnitList", "WorkOrderItemTasks", "WorkOrderItemOutsideServiceList", //"WorkOrderServiceTemplate", "QuoteList", //"WorkOrderQuoteTemplate", "PMList", "PMTemplate", "UnitList", "UnitModels", "ContractList", "ProjectList", "CustomerServiceRequestList", "LoanUnitList", "PartList", "PartAssemblyList", "PartInventoryList", "InventoryPurchaseOrders", "PartInventoryTransactionList", "PartWarehouseList", "PurchaseOrderUIRestockList", "VendorList", "AdministrationGlobalSettings", "HelpLicense", "UserList", "Translation", "TranslationList", "ReportList", "ReminderList", "Inventory", "Accounting", "TaxCodeList", "ServiceRateList", "TravelRateList", //"ServiceBankList", "Administration", "Operations", "Attachments", "Review", "Extensions", "History", "Statistics", "Backup", "ServerState", "ServerJobs", "ServerLog", "ServerMetrics", "ServerProfiler", "NotificationSettings", "ViewServerConfiguration", "HelpAboutAyaNova", "MenuHelp", "More", "Logout", "Active", "Copy", "New", "Cancel", "Close", "Save", "SaveACopy", "Delete", "SoftDelete", "SoftDeleteAll", "Undelete", "Add", "Replace", "Remove", "OK", "Open", "Print", "Report", "Refresh", "Sort", //"WikiPage", "Duplicate", "RecordHistory", "Search", "TypeToSearchOrAdd", "SelectedItems", "AllItemsInList", "NoData", "Errors", "ErrorFieldLengthExceeded", "ErrorStartDateAfterEndDate", "ErrorRequiredFieldEmpty", "ErrorFieldValueNotInteger", "ErrorFieldValueNotDecimal", "ErrorAPI2000", "ErrorAPI2001", "ErrorAPI2002", "ErrorAPI2003", "ErrorAPI2004", "ErrorAPI2005", "ErrorAPI2006", "ErrorAPI2010", "ErrorAPI2020", "ErrorAPI2030", "ErrorAPI2040", "ErrorAPI2200", "ErrorAPI2201", "ErrorAPI2202", "ErrorAPI2203", "ErrorAPI2204", "ErrorAPI2205", "ErrorAPI2206", "ErrorAPI2207", "ErrorAPI2208", "ErrorAPI2209", "ErrorAPI2210", "ErrorAPI2212", "ErrorServerUnresponsive", "ErrorUserNotAuthenticated", "ErrorUserNotAuthorized", "ErrorNoMatch", "ErrorPickListQueryInvalid", "ErrorSecurityUserCapacity", "ErrorDBForeignKeyViolation", "DeletePrompt", "AreYouSureUnsavedChanges", "Leave", "Tags", "Tag", "Customize", "ObjectCustomFieldCustomGrid", "RowsPerPage", "PageOfPageText", "Loading", "Filter", "FilterUnsaved", "Heading", "Table", "InsertLink", "LinkUrl", "LinkText", "InsertImage", "ImageUrl", "ImageDescription", "AttachFile", "AttachmentNotes", "Upload", "AttachmentFileName", "FileAttachment", "MaintenanceExpired", "MaintenanceExpiredNote", "Import", "Export", "TimeSpanYears", "TimeSpanMonths", "TimeSpanDays", "TimeSpanHours", "TimeSpanMinutes", "TimeSpanSeconds", "DirectNotification", "UpdateAvailable", "DropFilesHere", "First", "Backward", "Forward", "Last", "GeoCapture", "GeoView", "CopyToClipboard", "AyaType", "Now", "DateRangeToday" ], //////////////////////////////////////////////////////// // Take in a string that contains one or more //translation keys that start with LT: //translate each and replace and return the string translated // (fetch and cache any missing strings) async translateStringWithMultipleKeysAsync(s) { let ret = s; const found = s.match(/LT:[\w]*/gm); if (found == null) { return ret; } //clean up the keys for fetching const keysToCache = found.map(z => z.replace("LT:", "")); //cache / fetch any that are not already present await this.cacheTranslations(keysToCache); //replace found.forEach(z => { const translated = this.get(z.replace("LT:", "")); //replace all ret = ret.split(z).join(translated); }); return ret; }, //////////////////////////////////////////////////////// // Take in a string that contains one or more //translation keys that start with LT: //translate each and replace and return the string translated // (DOES NOT fetch and cache any missing strings, they must exist) //this is the sync version to be used in non async capable code translateStringWithMultipleKeys(s) { let ret = s; const found = s.match(/LT:[\w]*/gm); if (found == null) { return ret; } //replace found.forEach(z => { const translated = this.get(z.replace("LT:", "")); //replace all ret = ret.split(z).join(translated); }); return ret; }, //////////////////////////////////////////////////////// // dynamically set the vuetify language elements from // users translated text // Keeping vuetify using en locale and just adjusting on top of that // setVuetifyDefaultLanguageElements(vm) { vm.$vuetify.lang.locales.en.close = this.get("OK"); } };