This commit is contained in:
327
src/api/translation.js
Normal file
327
src/api/translation.js
Normal file
@@ -0,0 +1,327 @@
|
||||
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] 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) {
|
||||
// eslint-disable-next-line no-async-promise-executor
|
||||
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 Sockeye work for any user
|
||||
coreKeys: [
|
||||
//main nav options
|
||||
"Home",
|
||||
"Dashboard",
|
||||
"Schedule",
|
||||
"MemoList",
|
||||
"ReviewList",
|
||||
"UserSettings",
|
||||
"SetLoginPassword",
|
||||
"NotifySubscriptionList",
|
||||
"UserPreferences",
|
||||
"Service",
|
||||
"CustomerList",
|
||||
"HeadOfficeList",
|
||||
"VendorList",
|
||||
"CustomerNotifySubscriptionList",
|
||||
"Contacts",
|
||||
"AdministrationGlobalSettings",
|
||||
"HelpLicense",
|
||||
"UserList",
|
||||
"Translation",
|
||||
"TranslationList",
|
||||
"ReportList",
|
||||
"ReminderList",
|
||||
"Accounting",
|
||||
"Administration",
|
||||
"Operations",
|
||||
"Attachments",
|
||||
"Review",
|
||||
"Extensions",
|
||||
"History",
|
||||
"Statistics",
|
||||
"Backup",
|
||||
"ServerState",
|
||||
"ServerJobs",
|
||||
"ServerLog",
|
||||
"ServerMetrics",
|
||||
"ServerProfiler",
|
||||
"OpsNotificationSettings",
|
||||
"ViewServerConfiguration",
|
||||
"NotificationCustomerDeliveryLog",
|
||||
"NotificationDeliveryLog",
|
||||
"HelpAboutSockeye",
|
||||
"MenuHelp",
|
||||
"More",
|
||||
"Logout",
|
||||
"Active",
|
||||
"Copy",
|
||||
"New",
|
||||
"Cancel",
|
||||
"Close",
|
||||
"Save",
|
||||
"SaveACopy",
|
||||
"Delete",
|
||||
"SoftDelete",
|
||||
"SoftDeleteAll",
|
||||
"Undelete",
|
||||
"Add",
|
||||
"Replace",
|
||||
"Remove",
|
||||
"OK",
|
||||
"Open",
|
||||
"Print",
|
||||
"Report",
|
||||
"Refresh",
|
||||
"Sort",
|
||||
"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",
|
||||
"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",
|
||||
"SockType",
|
||||
"Now",
|
||||
"DateRangeToday",
|
||||
"ReportRenderTimeOut",
|
||||
"RenderingReport",
|
||||
"Settings",
|
||||
"IntegrationList",
|
||||
"BusinessSettings",
|
||||
"LicenseList",
|
||||
"License",
|
||||
"TrialLicenseRequestList",
|
||||
"SubscriptionServerList",
|
||||
"ProductList",
|
||||
"PurchaseList",
|
||||
"GZCaseList"
|
||||
],
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
// 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) {
|
||||
if (s == null) {
|
||||
return 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");
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user