From f64b685428b942d7e2762af8a90ed03851846dbd Mon Sep 17 00:00:00 2001 From: bra11311 Date: Fri, 27 Sep 2024 09:02:42 -0700 Subject: [PATCH 1/4] chore: add translations helpers - add function that takes any type of variable and updates it based on the t9n file --- src/interfaces/languageSwitcherInterfaces.ts | 20 +++ .../language-switcher/support/utils.ts | 169 ++++++++++++++++++ 2 files changed, 189 insertions(+) diff --git a/src/interfaces/languageSwitcherInterfaces.ts b/src/interfaces/languageSwitcherInterfaces.ts index 171c03c..6fff8e9 100644 --- a/src/interfaces/languageSwitcherInterfaces.ts +++ b/src/interfaces/languageSwitcherInterfaces.ts @@ -18,3 +18,23 @@ export interface HandleGroupedContentArgs extends HandleContentBaseArgs { export interface HandleContentArgs extends HandleContentBaseArgs { withinConfigurationExperience: boolean; } + +export interface UpdateValueFromTranslationArgs { + fieldName: string; + stringValue: string; + parentValue: any; +} +export interface ProcessTranslationValueArgs { + parentValue: any; + params: string[]; + stringValue: string; + updateBatch: boolean; +} + +export interface ProcessTranslationNestedValueArgs { + parentValue: any; + param: string; + params: string[]; + stringValue: string; + updateBatch: boolean; +} diff --git a/src/structuralFunctionality/language-switcher/support/utils.ts b/src/structuralFunctionality/language-switcher/support/utils.ts index f3d0aaf..be73763 100644 --- a/src/structuralFunctionality/language-switcher/support/utils.ts +++ b/src/structuralFunctionality/language-switcher/support/utils.ts @@ -15,6 +15,9 @@ import { isWithinConfigurationExperience } from "../../../functionality/configur import { HandleGroupedContentArgs, LanguageData, + ProcessTranslationNestedValueArgs, + ProcessTranslationValueArgs, + UpdateValueFromTranslationArgs, } from "../../../interfaces/languageSwitcherInterfaces"; // Determines default locale based on portal or locale url param @@ -327,3 +330,169 @@ export async function getT9nData( ...configSettings, }; } + +export function convertT9nToConfigData( + data: { [key: string]: string }, + base: ApplicationBase +): { [key: string]: any } { + const config = structuredClone(base.config); + const t9nData = {}; + + for (const key in data) { + const { fieldName, value } = getValuesToWrite(key, data[key], config); + t9nData[fieldName] = value; + } + + return t9nData; +} + +function getValuesToWrite( + fieldName: string, + value: string, + config: ApplicationConfig +): { fieldName: string; value: any } { + const { idItems } = getNestedIDs(fieldName); + let fieldNameToUse = fieldName; + let valueToUse = value; + + if (idItems.length > 1) { + const parentID = idItems[0]; + const parentValue = getDefaultValue(parentID, config); + fieldNameToUse = parentID; + valueToUse = updateValueFromTranslation({ + fieldName, + stringValue: value, + parentValue, + }); + } + return { fieldName: fieldNameToUse, value: valueToUse }; +} + +export function updateValueFromTranslation({ + ...args +}: UpdateValueFromTranslationArgs): any { + const { fieldName, stringValue, parentValue } = args; + const params = fieldName.split("."); + if ( + Array.isArray(parentValue) || + (typeof parentValue === "object" && parentValue !== null) + ) { + params.shift(); + processValueFromTranslation({ + parentValue, + params, + stringValue, + updateBatch: false, + }); + return parentValue; + } else { + return stringValue; + } +} + +function processValueFromTranslation({ + ...args +}: ProcessTranslationValueArgs): boolean { + const { parentValue, params, stringValue, updateBatch } = args; + const [param, ...restParams] = params; + if (Array.isArray(parentValue)) { + processArrayFromTranslation({ + parentValue, + param, + params: restParams, + stringValue, + updateBatch, + }); + } else if (typeof parentValue === "object" && parentValue !== null) { + processObjectFromTranslation({ + parentValue, + param, + params: restParams, + stringValue, + updateBatch, + }); + } + return updateBatch; +} + +function processArrayFromTranslation({ + ...args +}: ProcessTranslationNestedValueArgs): void { + let { parentValue, param, params, stringValue, updateBatch } = args; + const [key, uid] = param.split("-"); + for (const item of parentValue) { + if (item._uid === uid) { + if (typeof item[key] === "string" && item[key] !== stringValue) { + item[key] = stringValue; + updateBatch = true; + break; + } + processValueFromTranslation({ + parentValue: item[key], + params, + stringValue, + updateBatch, + }); + } + } +} + +function processObjectFromTranslation({ + ...args +}: ProcessTranslationNestedValueArgs): void { + let { parentValue, param, params, stringValue, updateBatch } = args; + const result = parentValue[param]; + if (Array.isArray(result)) { + processArrayFromTranslation({ + parentValue: result, + param: params[0], + params: params.slice(1), + stringValue, + updateBatch, + }); + } else if (typeof result === "object" && result !== null) { + processValueFromTranslation({ + parentValue: result, + params, + stringValue, + updateBatch, + }); + } else if (result !== stringValue) { + parentValue[param] = stringValue; + updateBatch = true; + } +} + +export function getNestedIDs(key: string): { + idItems: string[]; + uid: string | null; +} { + const IDs = getNestedIDsArray(key); + const uid = IDs.length > 2 ? IDs[IDs.length - 1] : null; + if (uid) IDs.pop(); + const data: { idItems: string[]; uid: string | null } = { + idItems: IDs, + uid: null, + }; + if (uid) data.uid = uid; + return data; +} + +function getNestedIDsArray(key: string): string[] { + const subtrings = key.split("-"); + const subtrings2 = subtrings[0].split("."); + const IDs = [...subtrings2, subtrings[1]].filter(Boolean); + return IDs; +} + +function getDefaultValue( + fieldName: string, + templateAppDataValues: ApplicationConfig +): any { + return templateAppDataValues?.draft && + fieldName in templateAppDataValues.draft + ? templateAppDataValues.draft[fieldName] + : fieldName in templateAppDataValues + ? templateAppDataValues[fieldName] + : null; +} From d867d5b9375453d7481880c2b2108889e1637827 Mon Sep 17 00:00:00 2001 From: bra11311 Date: Fri, 27 Sep 2024 09:07:51 -0700 Subject: [PATCH 2/4] chore: remove updateBatch --- src/interfaces/languageSwitcherInterfaces.ts | 2 -- .../language-switcher/support/utils.ts | 17 ++++------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/interfaces/languageSwitcherInterfaces.ts b/src/interfaces/languageSwitcherInterfaces.ts index 6fff8e9..414a512 100644 --- a/src/interfaces/languageSwitcherInterfaces.ts +++ b/src/interfaces/languageSwitcherInterfaces.ts @@ -28,7 +28,6 @@ export interface ProcessTranslationValueArgs { parentValue: any; params: string[]; stringValue: string; - updateBatch: boolean; } export interface ProcessTranslationNestedValueArgs { @@ -36,5 +35,4 @@ export interface ProcessTranslationNestedValueArgs { param: string; params: string[]; stringValue: string; - updateBatch: boolean; } diff --git a/src/structuralFunctionality/language-switcher/support/utils.ts b/src/structuralFunctionality/language-switcher/support/utils.ts index be73763..2180a1c 100644 --- a/src/structuralFunctionality/language-switcher/support/utils.ts +++ b/src/structuralFunctionality/language-switcher/support/utils.ts @@ -382,7 +382,6 @@ export function updateValueFromTranslation({ parentValue, params, stringValue, - updateBatch: false, }); return parentValue; } else { @@ -392,8 +391,8 @@ export function updateValueFromTranslation({ function processValueFromTranslation({ ...args -}: ProcessTranslationValueArgs): boolean { - const { parentValue, params, stringValue, updateBatch } = args; +}: ProcessTranslationValueArgs): void { + const { parentValue, params, stringValue } = args; const [param, ...restParams] = params; if (Array.isArray(parentValue)) { processArrayFromTranslation({ @@ -401,7 +400,6 @@ function processValueFromTranslation({ param, params: restParams, stringValue, - updateBatch, }); } else if (typeof parentValue === "object" && parentValue !== null) { processObjectFromTranslation({ @@ -409,29 +407,25 @@ function processValueFromTranslation({ param, params: restParams, stringValue, - updateBatch, }); } - return updateBatch; } function processArrayFromTranslation({ ...args }: ProcessTranslationNestedValueArgs): void { - let { parentValue, param, params, stringValue, updateBatch } = args; + let { parentValue, param, params, stringValue } = args; const [key, uid] = param.split("-"); for (const item of parentValue) { if (item._uid === uid) { if (typeof item[key] === "string" && item[key] !== stringValue) { item[key] = stringValue; - updateBatch = true; break; } processValueFromTranslation({ parentValue: item[key], params, stringValue, - updateBatch, }); } } @@ -440,7 +434,7 @@ function processArrayFromTranslation({ function processObjectFromTranslation({ ...args }: ProcessTranslationNestedValueArgs): void { - let { parentValue, param, params, stringValue, updateBatch } = args; + let { parentValue, param, params, stringValue } = args; const result = parentValue[param]; if (Array.isArray(result)) { processArrayFromTranslation({ @@ -448,18 +442,15 @@ function processObjectFromTranslation({ param: params[0], params: params.slice(1), stringValue, - updateBatch, }); } else if (typeof result === "object" && result !== null) { processValueFromTranslation({ parentValue: result, params, stringValue, - updateBatch, }); } else if (result !== stringValue) { parentValue[param] = stringValue; - updateBatch = true; } } From 4a19a16b9523b70aacc5fd456b44844b620a506e Mon Sep 17 00:00:00 2001 From: bra11311 Date: Fri, 27 Sep 2024 10:38:55 -0700 Subject: [PATCH 3/4] fix: don't show languageSwitcher if there are no locales --- src/functionality/esriWidgetUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functionality/esriWidgetUtils.ts b/src/functionality/esriWidgetUtils.ts index ed1b088..41d3db8 100644 --- a/src/functionality/esriWidgetUtils.ts +++ b/src/functionality/esriWidgetUtils.ts @@ -729,7 +729,7 @@ export async function addLanguageSwitcher( const uniqueId = "esri-language-switcher"; let node = view.ui.find(uniqueId) as __esri.Expand; - if (!languageSwitcher) { + if (!languageSwitcher || !languageSwitcherConfig?.locales?.length) { if (node) view.ui.remove(node); return; } From 5dd9a3f10fa59aa78ae45a9aab877bfc0a2c8c91 Mon Sep 17 00:00:00 2001 From: bra11311 Date: Mon, 30 Sep 2024 09:29:45 -0700 Subject: [PATCH 4/4] Update esriWidgetUtils.ts --- src/functionality/esriWidgetUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functionality/esriWidgetUtils.ts b/src/functionality/esriWidgetUtils.ts index 41d3db8..ed1b088 100644 --- a/src/functionality/esriWidgetUtils.ts +++ b/src/functionality/esriWidgetUtils.ts @@ -729,7 +729,7 @@ export async function addLanguageSwitcher( const uniqueId = "esri-language-switcher"; let node = view.ui.find(uniqueId) as __esri.Expand; - if (!languageSwitcher || !languageSwitcherConfig?.locales?.length) { + if (!languageSwitcher) { if (node) view.ui.remove(node); return; }