Files

30 lines
798 B
TypeScript

/** Shallow-deep merge for translation fallbacks */
export function mergeTranslations<T extends Record<string, unknown>>(
base: T,
override: Partial<T>
): T {
const result = { ...base };
for (const key of Object.keys(override) as (keyof T)[]) {
const baseVal = base[key];
const overrideVal = override[key];
if (
overrideVal &&
typeof overrideVal === 'object' &&
!Array.isArray(overrideVal) &&
baseVal &&
typeof baseVal === 'object' &&
!Array.isArray(baseVal)
) {
result[key] = mergeTranslations(
baseVal as Record<string, unknown>,
overrideVal as Record<string, unknown>
) as T[keyof T];
} else if (overrideVal !== undefined) {
result[key] = overrideVal as T[keyof T];
}
}
return result;
}