/* eslint-disable @typescript-eslint/no-explicit-any */ import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet } from "../core/i18n/messages_defaultSet/types"; import { type ReturnTypeOfCreateUseI18n, createUseI18n } from "./useI18n"; export type I18nBuilder< ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never, ExcludedMethod extends "withThemeName" | "withExtraLanguages" | "withCustomTranslations" = never > = Omit< { withThemeName: () => I18nBuilder< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | "withThemeName" >; withExtraLanguages: (extraLanguageTranslations: { [LanguageTag in LanguageTag_notInDefaultSet]: { label: string; getMessages: () => Promise<{ default: Record; }>; }; }) => I18nBuilder< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | "withExtraLanguages" >; withCustomTranslations: ( messagesByLanguageTag_themeDefined: Partial<{ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record< MessageKey_themeDefined, string | Record >; }> ) => I18nBuilder< ThemeName, string extends MessageKey_themeDefined ? never : MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | "withCustomTranslations" >; build: () => ReturnTypeOfCreateUseI18n; }, ExcludedMethod >; function createI18nBuilder< ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never >(params: { extraLanguageTranslations: { [LanguageTag in LanguageTag_notInDefaultSet]: { label: string; getMessages: () => Promise<{ default: Record; }>; }; }; messagesByLanguageTag_themeDefined: Partial<{ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record< MessageKey_themeDefined, string | Record >; }>; }): I18nBuilder { const i18nBuilder: I18nBuilder = { withThemeName: () => createI18nBuilder({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any }), withExtraLanguages: extraLanguageTranslations => createI18nBuilder({ extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any }), withCustomTranslations: messagesByLanguageTag_themeDefined => createI18nBuilder({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined }), build: () => createUseI18n({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined }) }; return i18nBuilder; } export const i18nBuilder = createI18nBuilder({ extraLanguageTranslations: {}, messagesByLanguageTag_themeDefined: {} });