import { en } from './en' import type { Translations } from './types' type TranslationOverride = T extends (...args: never[]) => string ? T : T extends readonly unknown[] ? T : T extends string ? string : T extends object ? { [K in keyof T]?: TranslationOverride } : T export type TranslationOverrides = TranslationOverride function isRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null && !Array.isArray(value) } function mergeTranslations(base: T, overrides: TranslationOverride | undefined): T { if (!isRecord(base) || !isRecord(overrides)) { return (overrides ?? base) as T } const result: Record = { ...base } for (const [key, value] of Object.entries(overrides)) { if (value === undefined) { continue } const baseValue = result[key] result[key] = isRecord(baseValue) && isRecord(value) ? mergeTranslations(baseValue, value) : value } return result as T } export function defineLocale(overrides: TranslationOverrides): Translations { return mergeTranslations(en, overrides) }