import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet } from "../messages_defaultSet/types"; import { type ReturnTypeOfCreateUseI18n, createUseI18n } from "../withJsx/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: < LanguageTag_notInDefaultSet extends string >(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, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | "withCustomTranslations" >; create: () => ReturnTypeOfCreateUseI18n< MessageKey_themeDefined, LanguageTag_notInDefaultSet >; }, 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< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet > = { 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 }), create: () => createUseI18n({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined }) }; return i18nBuilder; } export const i18nBuilder = createi18nBuilder({ extraLanguageTranslations: {}, messagesByLanguageTag_themeDefined: {} });