experimental-ciao-react 1.1.16 → 1.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -695,10 +695,51 @@ function usePreloader({ effectiveManifest, currentLanguage, delay, enabled, load
695
695
  ]);
696
696
  }
697
697
 
698
+ //#endregion
699
+ //#region src/fetchInterceptor.ts
700
+ let originalFetch = null;
701
+ let isPatched = false;
702
+ function getHeaders() {
703
+ const currentLanguage = useTranslationStore.getState().currentLanguage;
704
+ const defaultLanguage = useTranslationStore.getState().defaultLanguage;
705
+ let acceptLanguage = currentLanguage;
706
+ if (defaultLanguage && defaultLanguage !== currentLanguage) acceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;
707
+ return {
708
+ "X-Ciao-Language": currentLanguage,
709
+ "Accept-Language": acceptLanguage
710
+ };
711
+ }
712
+ function patchGlobalFetch() {
713
+ if (typeof window === "undefined" || typeof fetch === "undefined") return;
714
+ if (isPatched) return;
715
+ originalFetch = window.fetch;
716
+ isPatched = true;
717
+ window.fetch = function(input, init) {
718
+ const headers = getHeaders();
719
+ const mergedHeaders = new Headers(init?.headers);
720
+ if (!mergedHeaders.has("X-Ciao-Language")) mergedHeaders.set("X-Ciao-Language", headers["X-Ciao-Language"]);
721
+ if (!mergedHeaders.has("Accept-Language")) mergedHeaders.set("Accept-Language", headers["Accept-Language"]);
722
+ return originalFetch(input, {
723
+ ...init,
724
+ headers: mergedHeaders
725
+ });
726
+ };
727
+ }
728
+ function unpatchGlobalFetch() {
729
+ if (typeof window === "undefined") return;
730
+ if (!isPatched || !originalFetch) return;
731
+ window.fetch = originalFetch;
732
+ originalFetch = null;
733
+ isPatched = false;
734
+ }
735
+ function isFetchPatched() {
736
+ return isPatched;
737
+ }
738
+
698
739
  //#endregion
699
740
  //#region src/components/CiaoProvider.tsx
700
741
  const PRELOAD_DELAY_MS = 5e3;
701
- function CiaoProvider({ children, translations, manifest, defaultLanguage = "en", availableLanguages, onLanguageChange, detectLanguage = true, blockUntilReady = true, fallback = null, preloadLanguages = true, preloadDelay = PRELOAD_DELAY_MS, hotUpdates = { enabled: true } }) {
742
+ function CiaoProvider({ children, translations, manifest, defaultLanguage = "en", availableLanguages, onLanguageChange, detectLanguage = true, blockUntilReady = true, fallback = null, preloadLanguages = true, preloadDelay = PRELOAD_DELAY_MS, hotUpdates = { enabled: true }, autoInjectHeaders = true }) {
702
743
  const loadTranslations = useTranslationStore((state) => state.loadTranslations);
703
744
  const setReady = useTranslationStore((state) => state.setReady);
704
745
  const currentLanguage = useTranslationStore((state) => state.currentLanguage);
@@ -772,6 +813,12 @@ function CiaoProvider({ children, translations, manifest, defaultLanguage = "en"
772
813
  abortControllerRef.current?.abort();
773
814
  };
774
815
  }, [abortControllerRef]);
816
+ (0, react.useEffect)(() => {
817
+ if (autoInjectHeaders) patchGlobalFetch();
818
+ return () => {
819
+ if (autoInjectHeaders) unpatchGlobalFetch();
820
+ };
821
+ }, [autoInjectHeaders]);
775
822
  if (blockUntilReady && (!isReady || !isHydrated)) return /* @__PURE__ */ react.default.createElement(react.default.Fragment, null, fallback);
776
823
  return /* @__PURE__ */ react.default.createElement(react.default.Fragment, null, children);
777
824
  }
@@ -1183,7 +1230,24 @@ function getCiaoLanguage() {
1183
1230
  return useTranslationStore.getState().currentLanguage;
1184
1231
  }
1185
1232
  function getCiaoHeaders() {
1186
- return { "X-Ciao-Language": useTranslationStore.getState().currentLanguage };
1233
+ const currentLanguage = useTranslationStore.getState().currentLanguage;
1234
+ const defaultLanguage = useTranslationStore.getState().defaultLanguage;
1235
+ let acceptLanguage = currentLanguage;
1236
+ if (defaultLanguage && defaultLanguage !== currentLanguage) acceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;
1237
+ return {
1238
+ "X-Ciao-Language": currentLanguage,
1239
+ "Accept-Language": acceptLanguage
1240
+ };
1241
+ }
1242
+ function ciaoFetch(input, init) {
1243
+ const headers = getCiaoHeaders();
1244
+ const mergedHeaders = new Headers(init?.headers);
1245
+ if (!mergedHeaders.has("X-Ciao-Language")) mergedHeaders.set("X-Ciao-Language", headers["X-Ciao-Language"]);
1246
+ if (!mergedHeaders.has("Accept-Language")) mergedHeaders.set("Accept-Language", headers["Accept-Language"]);
1247
+ return fetch(input, {
1248
+ ...init,
1249
+ headers: mergedHeaders
1250
+ });
1187
1251
  }
1188
1252
 
1189
1253
  //#endregion
@@ -1193,6 +1257,7 @@ exports.CiaoProvider = CiaoProvider;
1193
1257
  exports.LANGUAGE_DATA = LANGUAGE_DATA;
1194
1258
  exports.LanguageSwitcher = LanguageSwitcher;
1195
1259
  exports.Trans = Trans;
1260
+ exports.ciaoFetch = ciaoFetch;
1196
1261
  exports.clearCache = clearCache;
1197
1262
  exports.clearFormatterCache = clearFormatterCache;
1198
1263
  exports.formatLanguageDisplay = formatLanguageDisplay;
@@ -1202,6 +1267,9 @@ exports.getCiaoLanguage = getCiaoLanguage;
1202
1267
  exports.getFullLanguageInfo = getFullLanguageInfo;
1203
1268
  exports.getLanguageInfo = getLanguageInfo;
1204
1269
  exports.interpolate = interpolate;
1270
+ exports.isFetchPatched = isFetchPatched;
1271
+ exports.patchGlobalFetch = patchGlobalFetch;
1272
+ exports.unpatchGlobalFetch = unpatchGlobalFetch;
1205
1273
  exports.useAvailableLanguages = useAvailableLanguages;
1206
1274
  exports.useAvailableLanguagesInfo = useAvailableLanguagesInfo;
1207
1275
  exports.useCt = useCt;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["options: Intl.DateTimeFormatOptions","result: string","key: string","format: string | undefined","hydrationResolver: (() => void) | null","dbPromise: Promise<IDBDatabase> | null","entry: CacheEntry","updatedLanguages: string[]","LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n>","values: InterpolationValues | undefined","elements: ReactElement[]","result: ReactNode[]","match: RegExpExecArray | null","translated: string"],"sources":["../src/components/CTContextBlock.tsx","../src/interpolate.ts","../src/store.ts","../src/cache.ts","../src/hooks/useHotUpdates.ts","../src/hooks/useManifest.ts","../src/hooks/useTranslationLoader.ts","../src/utils/browserLanguage.ts","../src/hooks/useLanguageInit.ts","../src/hooks/usePreloader.ts","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/hooks/useCt.ts","../src/components/Trans.tsx","../src/hooks/useLanguage.ts"],"sourcesContent":["import React from \"react\";\nimport type { CTContextBlockProps } from \"../types\";\n\nexport function CTContextBlock({ children }: CTContextBlockProps) {\n\treturn <>{children}</>;\n}\n","export type InterpolationValues = Record<string, unknown>;\n\nconst MAX_CACHE_SIZE = 100;\n\ninterface BoundedCache<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n\thas(key: K): boolean;\n\tclear(): void;\n}\n\nfunction createBoundedCache<K, V>(maxSize: number): BoundedCache<K, V> {\n\tconst cache = new Map<K, V>();\n\treturn {\n\t\tget(key: K): V | undefined {\n\t\t\treturn cache.get(key);\n\t\t},\n\t\tset(key: K, value: V): void {\n\t\t\tif (cache.size >= maxSize) {\n\t\t\t\tconst firstKey = cache.keys().next().value;\n\t\t\t\tif (firstKey !== undefined) {\n\t\t\t\t\tcache.delete(firstKey);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcache.set(key, value);\n\t\t},\n\t\thas(key: K): boolean {\n\t\t\treturn cache.has(key);\n\t\t},\n\t\tclear(): void {\n\t\t\tcache.clear();\n\t\t},\n\t};\n}\n\nconst numberFormatCache = createBoundedCache<string, Intl.NumberFormat>(MAX_CACHE_SIZE);\nconst dateFormatCache = createBoundedCache<string, Intl.DateTimeFormat>(MAX_CACHE_SIZE);\nconst pluralRulesCache = createBoundedCache<string, Intl.PluralRules>(MAX_CACHE_SIZE);\n\nexport function clearFormatterCache(): void {\n\tnumberFormatCache.clear();\n\tdateFormatCache.clear();\n\tpluralRulesCache.clear();\n}\n\nfunction getNumberFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `number:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tmaximumFractionDigits: 20,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getCurrencyFormatter(\n\tlocale: string,\n\tcurrency: string,\n): Intl.NumberFormat {\n\tconst key = `currency:${locale}:${currency}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getPercentFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `percent:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"percent\",\n\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getDateFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `date:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\tdateStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getTimeFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `time:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\ttimeStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getPluralRules(locale: string): Intl.PluralRules {\n\tif (!pluralRulesCache.has(locale)) {\n\t\tpluralRulesCache.set(locale, new Intl.PluralRules(locale));\n\t}\n\treturn pluralRulesCache.get(locale)!;\n}\n\nexport function formatValue(\n\tvalue: unknown,\n\tformat: string | undefined,\n\tlocale: string,\n): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\n\tif (!format) {\n\t\treturn String(value);\n\t}\n\n\tconst parts = format.split(\":\");\n\tconst formatType = parts[0];\n\n\tswitch (formatType) {\n\t\tcase \"number\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getNumberFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"currency\": {\n\t\t\tconst currency = parts[1];\n\t\t\tif (!currency) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getCurrencyFormatter(locale, currency).format(num);\n\t\t}\n\n\t\tcase \"percent\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getPercentFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"date\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getDateFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"time\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getTimeFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"plural\": {\n\t\t\tconst singular = parts[1];\n\t\t\tconst plural = parts[2];\n\t\t\tif (!singular || !plural) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tconst rules = getPluralRules(locale);\n\t\t\tconst category = rules.select(num);\n\t\t\treturn category === \"one\" ? singular : plural;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\nexport function interpolate(\n\ttext: string,\n\tvalues: InterpolationValues | undefined,\n\tlocale: string,\n): string {\n\tconst escaped = text.replace(/\\{\\{/g, \"\\x00\").replace(/\\}\\}/g, \"\\x01\");\n\n\tlet result: string;\n\tif (!values || Object.keys(values).length === 0) {\n\t\tresult = escaped;\n\t} else {\n\t\tresult = escaped.replace(/\\{([^}]+)\\}/g, (match, placeholder) => {\n\t\t\tconst trimmed = placeholder.trim();\n\t\t\tconst colonIndex = trimmed.indexOf(\":\");\n\n\t\t\tlet key: string;\n\t\t\tlet format: string | undefined;\n\n\t\t\tif (colonIndex === -1) {\n\t\t\t\tkey = trimmed;\n\t\t\t\tformat = undefined;\n\t\t\t} else {\n\t\t\t\tkey = trimmed.substring(0, colonIndex);\n\t\t\t\tformat = trimmed.substring(colonIndex + 1);\n\t\t\t}\n\n\t\t\tif (!(key in values)) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tconst value = values[key];\n\t\t\treturn formatValue(value, format, locale);\n\t\t});\n\t}\n\n\treturn result.replace(/\\x00/g, \"{\").replace(/\\x01/g, \"}\");\n}\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { interpolate } from \"./interpolate\";\nimport type {\n\tInterpolationValues,\n\tLanguageTranslations,\n\tStoredManifest,\n\tTranslationMap,\n\tTranslationStore,\n} from \"./types\";\n\nlet hydrationResolver: (() => void) | null = null;\nconst hydrationPromise = new Promise<void>((resolve) => {\n\thydrationResolver = resolve;\n});\n\nexport const useTranslationStore = create<TranslationStore>()(\n\tpersist(\n\t\t(set) => ({\n\t\t\tcurrentLanguage: \"en\",\n\t\t\tdefaultLanguage: \"en\",\n\t\t\tavailableLanguages: [\"en\"],\n\t\t\ttranslations: {},\n\t\t\tisLoading: false,\n\t\t\tisReady: false,\n\t\t\tisHydrated: false,\n\t\t\tstoredManifest: null,\n\t\t\tlastVersionCheck: null,\n\n\t\t\tsetLanguage: (language: string) => {\n\t\t\t\tset({ currentLanguage: language, isReady: false });\n\t\t\t},\n\n\t\t\tloadTranslations: (translations: LanguageTranslations) => {\n\t\t\t\tset((state) => {\n\t\t\t\t\tconst languages = Object.keys(translations);\n\t\t\t\t\tconst availableLanguages = [\n\t\t\t\t\t\t...new Set([...state.availableLanguages, ...languages]),\n\t\t\t\t\t];\n\t\t\t\t\tconst merged = { ...state.translations };\n\t\t\t\t\tfor (const lang of languages) {\n\t\t\t\t\t\tmerged[lang] = { ...merged[lang], ...translations[lang] };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttranslations: merged,\n\t\t\t\t\t\tavailableLanguages,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\n\t\t\taddLanguage: (language: string, translations: TranslationMap) => {\n\t\t\t\tset((state) => ({\n\t\t\t\t\ttranslations: {\n\t\t\t\t\t\t...state.translations,\n\t\t\t\t\t\t[language]: { ...state.translations[language], ...translations },\n\t\t\t\t\t},\n\t\t\t\t\tavailableLanguages: state.availableLanguages.includes(language)\n\t\t\t\t\t\t? state.availableLanguages\n\t\t\t\t\t\t: [...state.availableLanguages, language],\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tsetLoading: (loading: boolean) => {\n\t\t\t\tset({ isLoading: loading });\n\t\t\t},\n\n\t\t\tsetReady: (ready: boolean) => {\n\t\t\t\tset({ isReady: ready });\n\t\t\t},\n\n\t\t\tsetStoredManifest: (manifest: StoredManifest) => {\n\t\t\t\tset({ storedManifest: manifest, lastVersionCheck: Date.now() });\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: \"ciao-tools-language\",\n\t\t\tpartialize: (state) => ({\n\t\t\t\tcurrentLanguage: state.currentLanguage,\n\t\t\t\tstoredManifest: state.storedManifest,\n\t\t\t}),\n\t\t\tonRehydrateStorage: () => (_, error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconsole.error(\"[ciao-tools] Storage hydration failed:\", error);\n\t\t\t\t}\n\t\t\t\tif (hydrationResolver) {\n\t\t\t\t\thydrationResolver();\n\t\t\t\t\thydrationResolver = null;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t),\n);\n\nhydrationPromise.then(() => {\n\tuseTranslationStore.setState({ isHydrated: true });\n});\n\nexport function getTranslation(\n\ttranslations: LanguageTranslations,\n\tlanguage: string,\n\ttext: string,\n\tvalues?: InterpolationValues,\n): string {\n\tconst translated = translations[language]?.[text] ?? text;\n\n\tif (!values || Object.keys(values).length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn interpolate(translated, values, language);\n}\n","import type { TranslationMap } from \"./types\";\n\nconst DB_NAME = \"ciao-tools-translations\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"translations\";\n\ninterface CacheEntry {\n\tlanguage: string;\n\tprojectId: string;\n\tdata: TranslationMap;\n\turl: string;\n\tcachedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDB(): Promise<IDBDatabase> {\n\tif (dbPromise) return dbPromise;\n\n\tdbPromise = new Promise((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\tdbPromise = null;\n\t\t\treject(new Error(\"IndexedDB not available\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst request = indexedDB.open(DB_NAME, DB_VERSION);\n\n\t\trequest.onerror = () => {\n\t\t\tdbPromise = null;\n\t\t\treject(request.error);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\t\t\tif (!db.objectStoreNames.contains(STORE_NAME)) {\n\t\t\t\tconst store = db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n\t\t\t\tstore.createIndex(\"language\", \"language\", { unique: false });\n\t\t\t\tstore.createIndex(\"projectId\", \"projectId\", { unique: false });\n\t\t\t}\n\t\t};\n\t});\n\n\treturn dbPromise;\n}\n\nexport async function getCachedTranslation(\n\turl: string,\n): Promise<TranslationMap | null> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\t\t\tconst request = store.get(url);\n\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst entry = request.result as CacheEntry | undefined;\n\t\t\t\tresolve(entry?.data ?? null);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to read from cache:\", error);\n\t\treturn null;\n\t}\n}\n\nexport async function cacheTranslation(\n\turl: string,\n\tlanguage: string,\n\tprojectId: string,\n\tdata: TranslationMap,\n): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst entry: CacheEntry = {\n\t\t\t\turl,\n\t\t\t\tlanguage,\n\t\t\t\tprojectId,\n\t\t\t\tdata,\n\t\t\t\tcachedAt: Date.now(),\n\t\t\t};\n\n\t\t\tconst request = store.put(entry);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => resolve();\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to write to cache:\", error);\n\t}\n}\n\nexport async function clearCache(projectId?: string): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tif (projectId) {\n\t\t\t\tconst index = store.index(\"projectId\");\n\t\t\t\tconst request = index.openCursor(IDBKeyRange.only(projectId));\n\t\t\t\trequest.onsuccess = (event) => {\n\t\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\tcursor.delete();\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => resolve();\n\t\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t\t} else {\n\t\t\t\tconst request = store.clear();\n\t\t\t\trequest.onerror = () => reject(request.error);\n\t\t\t\trequest.onsuccess = () => resolve();\n\t\t\t}\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to clear cache:\", error);\n\t}\n}\n\nexport async function getCacheStats(): Promise<{\n\tcount: number;\n\tlanguages: string[];\n}> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst countRequest = store.count();\n\t\t\tconst languages = new Set<string>();\n\n\t\t\tconst cursorRequest = store.openCursor();\n\t\t\tcursorRequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tlanguages.add((cursor.value as CacheEntry).language);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttransaction.oncomplete = () => {\n\t\t\t\tresolve({\n\t\t\t\t\tcount: countRequest.result,\n\t\t\t\t\tlanguages: Array.from(languages),\n\t\t\t\t});\n\t\t\t};\n\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to get cache stats:\", error);\n\t\treturn { count: 0, languages: [] };\n\t}\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { clearCache, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { HotUpdateConfig, StoredManifest, TranslationMap } from \"../types\";\n\nconst CDN_BASE_URL = \"https://t1.ciao-tools.com\";\n\ninterface LatestManifest {\n\tversion: number;\n\tupdatedAt: string;\n\turls: Record<string, string>;\n}\n\nasync function fetchLatestManifest(projectId: string): Promise<LatestManifest | null> {\n\tconst url = `${CDN_BASE_URL}/translations/${projectId}/latest.json`;\n\ttry {\n\t\tconst response = await fetch(url, { cache: \"no-cache\" });\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to fetch latest manifest: ${response.statusText}`);\n\t\t}\n\t\treturn response.json();\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to fetch latest manifest:\", error);\n\t\treturn null;\n\t}\n}\n\nasync function fetchTranslations(url: string): Promise<TranslationMap> {\n\tconst response = await fetch(url);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useHotUpdates(\n\tconfig: HotUpdateConfig | undefined,\n\tprojectId: string | undefined,\n\tsourceLanguage: string | undefined,\n) {\n\tconst isCheckingRef = useRef(false);\n\tconst hasCheckedOnMountRef = useRef(false);\n\n\tconst configRef = useRef(config);\n\tconst projectIdRef = useRef(projectId);\n\tconst sourceLanguageRef = useRef(sourceLanguage);\n\n\tuseEffect(() => {\n\t\tconfigRef.current = config;\n\t\tprojectIdRef.current = projectId;\n\t\tsourceLanguageRef.current = sourceLanguage;\n\t}, [config, projectId, sourceLanguage]);\n\n\tconst { setStoredManifest, addLanguage } = useTranslationStore();\n\n\tconst checkForUpdates = useCallback(async () => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\t\tconst currentSourceLanguage = sourceLanguageRef.current;\n\n\t\tif (!currentConfig || !currentProjectId || isCheckingRef.current) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tisCheckingRef.current = true;\n\n\t\ttry {\n\t\t\tconsole.log(\"[ciao-tools] Checking for hot updates...\");\n\t\t\tconst latestManifest = await fetchLatestManifest(currentProjectId);\n\n\t\t\tif (!latestManifest) {\n\t\t\t\tconsole.log(\"[ciao-tools] No latest.json found (project may not have hot updates yet)\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\"[ciao-tools] Found latest.json, version:\", latestManifest.version);\n\n\t\t\tconst currentManifest = useTranslationStore.getState().storedManifest;\n\t\t\tconst currentVersion = currentManifest?.serverVersion ?? null;\n\t\t\tconst isFirstCheck = currentVersion === null;\n\t\t\tconst hasNewVersion = currentVersion !== null && latestManifest.version > currentVersion;\n\n\t\t\tif (isFirstCheck || hasNewVersion) {\n\t\t\t\tif (Object.keys(latestManifest.urls).length > 0) {\n\t\t\t\t\tconst reason = hasNewVersion ? \"new version\" : \"first check\";\n\t\t\t\t\tconsole.log(`[ciao-tools] Fetching translations (${reason})...`);\n\n\t\t\t\t\tif (hasNewVersion) {\n\t\t\t\t\t\tawait clearCache(currentProjectId);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst updatedLanguages: string[] = [];\n\n\t\t\t\t\tfor (const [langCode, url] of Object.entries(latestManifest.urls)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst translations = await fetchTranslations(url);\n\t\t\t\t\t\t\taddLanguage(langCode, translations);\n\t\t\t\t\t\t\tawait cacheTranslation(url, langCode, currentProjectId, translations);\n\t\t\t\t\t\t\tupdatedLanguages.push(langCode);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(`[ciao-tools] Failed to fetch ${langCode} translations:`, err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedLanguages.length > 0) {\n\t\t\t\t\t\tconsole.log(\"[ciao-tools] Updated translations for:\", updatedLanguages);\n\t\t\t\t\t\tif (hasNewVersion && currentConfig.onTranslationsUpdated) {\n\t\t\t\t\t\t\tcurrentConfig.onTranslationsUpdated(updatedLanguages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newStoredManifest: StoredManifest = {\n\t\t\t\t\tserverVersion: latestManifest.version,\n\t\t\t\t\tupdatedAt: latestManifest.updatedAt,\n\t\t\t\t\tprojectId: currentProjectId,\n\t\t\t\t\tsourceLanguage: currentManifest?.sourceLanguage ?? currentSourceLanguage ?? \"en\",\n\t\t\t\t\tlanguages: Object.keys(latestManifest.urls),\n\t\t\t\t\tcdnUrls: latestManifest.urls,\n\t\t\t\t};\n\n\t\t\t\tsetStoredManifest(newStoredManifest);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"[ciao-tools] Already up to date (version \" + latestManifest.version + \")\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[ciao-tools] Hot update check failed:\", error);\n\t\t} finally {\n\t\t\tisCheckingRef.current = false;\n\t\t}\n\t}, [setStoredManifest, addLanguage]);\n\n\tuseEffect(() => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\n\t\tif (!currentConfig || !currentProjectId) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tif (!hasCheckedOnMountRef.current) {\n\t\t\thasCheckedOnMountRef.current = true;\n\t\t\tcheckForUpdates();\n\t\t}\n\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (document.visibilityState === \"visible\") {\n\t\t\t\tcheckForUpdates();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\t};\n\t}, [checkForUpdates]);\n\n\treturn { checkForUpdates };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, StoredManifest } from \"../types\";\n\nexport interface UseManifestOptions {\n\tmanifest?: CiaoManifest;\n}\n\nexport interface UseManifestResult {\n\teffectiveManifest: CiaoManifest | undefined;\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\thasManifestChanged: boolean;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n}\n\nfunction getManifestUrlsHash(manifest: CiaoManifest | undefined): string {\n\tif (!manifest) return \"\";\n\treturn JSON.stringify(manifest.cdnUrls);\n}\n\nexport function useManifest({ manifest }: UseManifestOptions): UseManifestResult {\n\tconst storedManifest = useTranslationStore((state) => state.storedManifest);\n\n\tconst effectiveManifest = useMemo((): CiaoManifest | undefined => {\n\t\tif (storedManifest && storedManifest.projectId === manifest?.projectId) {\n\t\t\treturn {\n\t\t\t\tversion: String(storedManifest.serverVersion),\n\t\t\t\tprojectId: storedManifest.projectId,\n\t\t\t\tsourceLanguage: storedManifest.sourceLanguage,\n\t\t\t\tlanguages: storedManifest.languages,\n\t\t\t\tcdnUrls: storedManifest.cdnUrls,\n\t\t\t\tgeneratedAt: storedManifest.updatedAt,\n\t\t\t};\n\t\t}\n\t\treturn manifest;\n\t}, [storedManifest, manifest]);\n\n\tconst manifestRef = useRef<CiaoManifest | undefined>(effectiveManifest);\n\tconst previousManifestHashRef = useRef<string>(\"\");\n\tconst loadedUrlsRef = useRef<Map<string, string>>(new Map());\n\tconst hasManifestChangedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tmanifestRef.current = effectiveManifest;\n\n\t\tconst newHash = getManifestUrlsHash(effectiveManifest);\n\t\tconst oldHash = previousManifestHashRef.current;\n\n\t\tif (oldHash && newHash && oldHash !== newHash) {\n\t\t\tloadedUrlsRef.current.clear();\n\t\t\tuseTranslationStore.setState({ translations: {} });\n\t\t\thasManifestChangedRef.current = true;\n\t\t} else {\n\t\t\thasManifestChangedRef.current = false;\n\t\t}\n\n\t\tpreviousManifestHashRef.current = newHash;\n\t}, [effectiveManifest]);\n\n\treturn {\n\t\teffectiveManifest,\n\t\tmanifestRef,\n\t\thasManifestChanged: hasManifestChangedRef.current,\n\t\tloadedUrlsRef,\n\t};\n}\n","import { useCallback, useRef } from \"react\";\nimport { getCachedTranslation, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, TranslationMap } from \"../types\";\n\nexport interface UseTranslationLoaderOptions {\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n\thotUpdatesEnabled?: boolean;\n}\n\nexport interface UseTranslationLoaderResult {\n\tloadLanguage: (language: string, isPreload?: boolean) => Promise<boolean>;\n\tabortControllerRef: React.RefObject<AbortController | null>;\n}\n\nasync function fetchTranslationsFromCDN(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<TranslationMap> {\n\tconst response = await fetch(url, { signal });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useTranslationLoader({\n\tmanifestRef,\n\tloadedUrlsRef,\n\thotUpdatesEnabled,\n}: UseTranslationLoaderOptions): UseTranslationLoaderResult {\n\tconst addLanguage = useTranslationStore((state) => state.addLanguage);\n\tconst setLoading = useTranslationStore((state) => state.setLoading);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst loadLanguage = useCallback(\n\t\tasync (language: string, isPreload = false): Promise<boolean> => {\n\t\t\tconst currentManifest = manifestRef.current;\n\t\t\tif (!currentManifest) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst cdnUrl = currentManifest.cdnUrls[language];\n\n\t\t\tif (!cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst loadedUrl = loadedUrlsRef.current.get(language);\n\t\t\tif (loadedUrl === cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!isPreload) {\n\t\t\t\tif (abortControllerRef.current) {\n\t\t\t\t\tabortControllerRef.current.abort();\n\t\t\t\t}\n\t\t\t\tabortControllerRef.current = new AbortController();\n\t\t\t}\n\n\t\t\tconst controller = isPreload ? undefined : abortControllerRef.current;\n\n\t\t\tif (!isPreload) {\n\t\t\t\tsetLoading(true);\n\t\t\t\tsetReady(false);\n\t\t\t}\n\n\t\t\tconst useCache = hotUpdatesEnabled !== true;\n\n\t\t\ttry {\n\t\t\t\tif (useCache) {\n\t\t\t\t\tconst cached = await getCachedTranslation(cdnUrl);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\tif (controller?.signal.aborted) return false;\n\t\t\t\t\t\taddLanguage(language, cached);\n\t\t\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\t\t\t\t\t\tif (!isPreload) {\n\t\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst translationData = await fetchTranslationsFromCDN(\n\t\t\t\t\tcdnUrl,\n\t\t\t\t\tcontroller?.signal,\n\t\t\t\t);\n\n\t\t\t\tif (controller?.signal.aborted) return false;\n\n\t\t\t\taddLanguage(language, translationData);\n\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\n\t\t\t\tif (useCache) {\n\t\t\t\t\tawait cacheTranslation(\n\t\t\t\t\t\tcdnUrl,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tcurrentManifest.projectId,\n\t\t\t\t\t\ttranslationData,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[ciao-tools] Failed to load translations for ${language}:`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tif (!isPreload) setLoading(false);\n\t\t\t}\n\t\t},\n\t\t[manifestRef, loadedUrlsRef, hotUpdatesEnabled, addLanguage, setLoading, setReady],\n\t);\n\n\treturn { loadLanguage, abortControllerRef };\n}\n","export function detectBrowserLanguage(availableLanguages: string[]): string | null {\n\tif (typeof navigator === \"undefined\") return null;\n\n\tconst browserLangs = navigator.languages || [navigator.language];\n\n\tfor (const browserLang of browserLangs) {\n\t\tconst normalized = browserLang.toLowerCase();\n\t\tif (availableLanguages.includes(normalized)) {\n\t\t\treturn normalized;\n\t\t}\n\t\tconst langCode = normalized.split(\"-\")[0];\n\t\tif (availableLanguages.includes(langCode)) {\n\t\t\treturn langCode;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { detectBrowserLanguage } from \"../utils/browserLanguage\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UseLanguageInitOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tavailableLanguages?: string[];\n\tdefaultLanguage: string;\n\tdetectLanguage: boolean;\n}\n\nexport function useLanguageInit({\n\teffectiveManifest,\n\tavailableLanguages,\n\tdefaultLanguage,\n\tdetectLanguage,\n}: UseLanguageInitOptions): void {\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst initializedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\t\tif (initializedRef.current) return;\n\t\tinitializedRef.current = true;\n\n\t\tconst store = useTranslationStore.getState();\n\t\tconst effectiveLanguages = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages || [];\n\n\t\tconst hasPersistedLanguage =\n\t\t\tstore.currentLanguage &&\n\t\t\tstore.currentLanguage !== \"en\" &&\n\t\t\teffectiveLanguages.includes(store.currentLanguage);\n\n\t\tif (hasPersistedLanguage) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (detectLanguage && effectiveLanguages.length > 0) {\n\t\t\tconst detected = detectBrowserLanguage(effectiveLanguages);\n\t\t\tif (detected) {\n\t\t\t\tsetLanguage(detected);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (defaultLanguage && defaultLanguage !== store.currentLanguage) {\n\t\t\tsetLanguage(defaultLanguage);\n\t\t}\n\t}, [\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t\tsetLanguage,\n\t\tisHydrated,\n\t]);\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UsePreloaderOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tcurrentLanguage: string;\n\tdelay: number;\n\tenabled: boolean;\n\tloadLanguage: (language: string, isPreload: boolean) => Promise<boolean>;\n}\n\nexport function usePreloader({\n\teffectiveManifest,\n\tcurrentLanguage,\n\tdelay,\n\tenabled,\n\tloadLanguage,\n}: UsePreloaderOptions): void {\n\tconst preloadTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst isMountedRef = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMountedRef.current = true;\n\t\treturn () => {\n\t\t\tisMountedRef.current = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!enabled || !effectiveManifest) return;\n\n\t\tif (preloadTimeoutRef.current) {\n\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t}\n\n\t\tpreloadTimeoutRef.current = setTimeout(async () => {\n\t\t\tif (!isMountedRef.current) return;\n\n\t\t\tconst languages = [...effectiveManifest.languages];\n\t\t\tfor (const language of languages) {\n\t\t\t\tif (!isMountedRef.current) break;\n\t\t\t\tif (language === effectiveManifest.sourceLanguage) continue;\n\t\t\t\tif (language === currentLanguage) continue;\n\n\t\t\t\tawait loadLanguage(language, true);\n\t\t\t}\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tif (preloadTimeoutRef.current) {\n\t\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, [effectiveManifest, currentLanguage, enabled, delay, loadLanguage]);\n}\n","import React, { useEffect } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { useHotUpdates } from \"../hooks/useHotUpdates\";\nimport { useManifest } from \"../hooks/useManifest\";\nimport { useTranslationLoader } from \"../hooks/useTranslationLoader\";\nimport { useLanguageInit } from \"../hooks/useLanguageInit\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport type { CiaoProviderProps } from \"../types\";\n\nconst PRELOAD_DELAY_MS = 5000;\n\nexport function CiaoProvider({\n\tchildren,\n\ttranslations,\n\tmanifest,\n\tdefaultLanguage = \"en\",\n\tavailableLanguages,\n\tonLanguageChange,\n\tdetectLanguage = true,\n\tblockUntilReady = true,\n\tfallback = null,\n\tpreloadLanguages = true,\n\tpreloadDelay = PRELOAD_DELAY_MS,\n\thotUpdates = { enabled: true },\n}: CiaoProviderProps) {\n\tconst loadTranslations = useTranslationStore((state) => state.loadTranslations);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\n\tconst { effectiveManifest, manifestRef, loadedUrlsRef } = useManifest({ manifest });\n\n\tconst { loadLanguage, abortControllerRef } = useTranslationLoader({\n\t\tmanifestRef,\n\t\tloadedUrlsRef,\n\t\thotUpdatesEnabled: hotUpdates?.enabled,\n\t});\n\n\tuseLanguageInit({\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t});\n\n\tusePreloader({\n\t\teffectiveManifest,\n\t\tcurrentLanguage,\n\t\tdelay: preloadDelay,\n\t\tenabled: preloadLanguages,\n\t\tloadLanguage,\n\t});\n\n\tuseHotUpdates(hotUpdates, manifest?.projectId, manifest?.sourceLanguage);\n\n\tuseEffect(() => {\n\t\tif (translations) {\n\t\t\tloadTranslations(translations);\n\t\t\tsetReady(true);\n\t\t}\n\t}, [translations, loadTranslations, setReady]);\n\n\tuseEffect(() => {\n\t\tconst languagesList = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages;\n\n\t\tif (languagesList) {\n\t\t\tconst store = useTranslationStore.getState();\n\t\t\tconst merged = [\n\t\t\t\t...new Set([...store.availableLanguages, ...languagesList]),\n\t\t\t];\n\t\t\tuseTranslationStore.setState({\n\t\t\t\tavailableLanguages: merged,\n\t\t\t\tdefaultLanguage,\n\t\t\t});\n\t\t}\n\t}, [availableLanguages, effectiveManifest, defaultLanguage]);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentLanguage === effectiveManifest?.sourceLanguage) {\n\t\t\tsetReady(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (effectiveManifest && currentLanguage) {\n\t\t\tloadLanguage(currentLanguage, false);\n\t\t} else if (!effectiveManifest) {\n\t\t\tsetReady(true);\n\t\t}\n\t}, [effectiveManifest, currentLanguage, loadLanguage, setReady, isHydrated]);\n\n\tuseEffect(() => {\n\t\tif (onLanguageChange) {\n\t\t\tonLanguageChange(currentLanguage);\n\t\t}\n\t}, [currentLanguage, onLanguageChange]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t};\n\t}, [abortControllerRef]);\n\n\tif (blockUntilReady && (!isReady || !isHydrated)) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn <>{children}</>;\n}\n","import React, { createContext, useContext, useCallback, type ReactNode } from \"react\";\nimport { useTranslationStore } from \"../store\";\n\nexport const LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n> = {\n\ten: { name: \"English\", nativeName: \"English\", flag: \"🇺🇸\" },\n\tes: { name: \"Spanish\", nativeName: \"Español\", flag: \"🇪🇸\" },\n\tfr: { name: \"French\", nativeName: \"Français\", flag: \"🇫🇷\" },\n\tde: { name: \"German\", nativeName: \"Deutsch\", flag: \"🇩🇪\" },\n\tit: { name: \"Italian\", nativeName: \"Italiano\", flag: \"🇮🇹\" },\n\tpt: { name: \"Portuguese\", nativeName: \"Português\", flag: \"🇵🇹\" },\n\tja: { name: \"Japanese\", nativeName: \"日本語\", flag: \"🇯🇵\" },\n\tko: { name: \"Korean\", nativeName: \"한국어\", flag: \"🇰🇷\" },\n\tzh: { name: \"Chinese\", nativeName: \"中文\", flag: \"🇨🇳\" },\n\tar: { name: \"Arabic\", nativeName: \"العربية\", flag: \"🇸🇦\" },\n\tru: { name: \"Russian\", nativeName: \"Русский\", flag: \"🇷🇺\" },\n\tnl: { name: \"Dutch\", nativeName: \"Nederlands\", flag: \"🇳🇱\" },\n\tpl: { name: \"Polish\", nativeName: \"Polski\", flag: \"🇵🇱\" },\n\tsv: { name: \"Swedish\", nativeName: \"Svenska\", flag: \"🇸🇪\" },\n\tda: { name: \"Danish\", nativeName: \"Dansk\", flag: \"🇩🇰\" },\n\tfi: { name: \"Finnish\", nativeName: \"Suomi\", flag: \"🇫🇮\" },\n\tno: { name: \"Norwegian\", nativeName: \"Norsk\", flag: \"🇳🇴\" },\n\ttr: { name: \"Turkish\", nativeName: \"Türkçe\", flag: \"🇹🇷\" },\n\tcs: { name: \"Czech\", nativeName: \"Čeština\", flag: \"🇨🇿\" },\n\tel: { name: \"Greek\", nativeName: \"Ελληνικά\", flag: \"🇬🇷\" },\n\the: { name: \"Hebrew\", nativeName: \"עברית\", flag: \"🇮🇱\" },\n\thu: { name: \"Hungarian\", nativeName: \"Magyar\", flag: \"🇭🇺\" },\n\tid: { name: \"Indonesian\", nativeName: \"Bahasa Indonesia\", flag: \"🇮🇩\" },\n\tth: { name: \"Thai\", nativeName: \"ไทย\", flag: \"🇹🇭\" },\n\tvi: { name: \"Vietnamese\", nativeName: \"Tiếng Việt\", flag: \"🇻🇳\" },\n\tuk: { name: \"Ukrainian\", nativeName: \"Українська\", flag: \"🇺🇦\" },\n\tro: { name: \"Romanian\", nativeName: \"Română\", flag: \"🇷🇴\" },\n\tbg: { name: \"Bulgarian\", nativeName: \"Български\", flag: \"🇧🇬\" },\n\tsk: { name: \"Slovak\", nativeName: \"Slovenčina\", flag: \"🇸🇰\" },\n\tlt: { name: \"Lithuanian\", nativeName: \"Lietuvių\", flag: \"🇱🇹\" },\n\tlv: { name: \"Latvian\", nativeName: \"Latviešu\", flag: \"🇱🇻\" },\n\tet: { name: \"Estonian\", nativeName: \"Eesti\", flag: \"🇪🇪\" },\n\tsl: { name: \"Slovenian\", nativeName: \"Slovenščina\", flag: \"🇸🇮\" },\n\tbs: { name: \"Bosnian\", nativeName: \"Bosanski\", flag: \"🇧🇦\" },\n\thr: { name: \"Croatian\", nativeName: \"Hrvatski\", flag: \"🇭🇷\" },\n\tsr: { name: \"Serbian\", nativeName: \"Српски\", flag: \"🇷🇸\" },\n\tkmr: { name: \"Kurdish\", nativeName: \"Kurdî\", flag: \"🇮🇶\" },\n\tfa: { name: \"Persian\", nativeName: \"فارسی\", flag: \"🇮🇷\" },\n\thi: { name: \"Hindi\", nativeName: \"हिन्दी\", flag: \"🇮🇳\" },\n\tbn: { name: \"Bengali\", nativeName: \"বাংলা\", flag: \"🇧🇩\" },\n\tms: { name: \"Malay\", nativeName: \"Bahasa Melayu\", flag: \"🇲🇾\" },\n};\n\nexport interface LanguageInfo {\n\tcode: string;\n\tname: string;\n\tnativeName: string;\n\tflag: string;\n}\n\nexport function getLanguageInfo(code: string): Omit<LanguageInfo, \"code\"> {\n\tconst normalized = code.toLowerCase();\n\treturn (\n\t\tLANGUAGE_DATA[normalized] ?? {\n\t\t\tname: code.toUpperCase(),\n\t\t\tnativeName: code.toUpperCase(),\n\t\t\tflag: \"🌐\",\n\t\t}\n\t);\n}\n\nexport function getFullLanguageInfo(code: string): LanguageInfo {\n\treturn {\n\t\tcode,\n\t\t...getLanguageInfo(code),\n\t};\n}\n\nexport type LanguageSwitcherDisplay =\n\t| \"flag\"\n\t| \"name\"\n\t| \"native\"\n\t| \"flag-name\"\n\t| \"flag-native\"\n\t| \"code\";\n\nexport function formatLanguageDisplay(\n\tcode: string,\n\tdisplay: LanguageSwitcherDisplay = \"flag-native\",\n): string {\n\tconst info = getLanguageInfo(code);\n\tswitch (display) {\n\t\tcase \"flag\":\n\t\t\treturn info.flag;\n\t\tcase \"name\":\n\t\t\treturn info.name;\n\t\tcase \"native\":\n\t\t\treturn info.nativeName;\n\t\tcase \"flag-name\":\n\t\t\treturn `${info.flag} ${info.name}`;\n\t\tcase \"flag-native\":\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t\tcase \"code\":\n\t\t\treturn code.toUpperCase();\n\t\tdefault:\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t}\n}\n\n// Simple default LanguageSwitcher (backward compatible)\nexport type LanguageSwitcherVariant = \"dropdown\" | \"buttons\" | \"minimal\";\n\nexport interface LanguageSwitcherProps {\n\tclassName?: string;\n\tvariant?: LanguageSwitcherVariant;\n\tdisplay?: LanguageSwitcherDisplay;\n\tonChange?: (language: string) => void;\n}\n\nexport default function LanguageSwitcher({\n\tclassName,\n\tvariant = \"dropdown\",\n\tdisplay = \"flag-native\",\n\tonChange,\n}: LanguageSwitcherProps) {\n\tconst { currentLanguage, availableLanguages, setLanguage } =\n\t\tuseTranslationStore();\n\n\tconst handleChange = (newLanguage: string) => {\n\t\tsetLanguage(newLanguage);\n\t\tonChange?.(newLanguage);\n\t};\n\n\tif (variant === \"buttons\") {\n\t\treturn (\n\t\t\t<div className={className} role=\"group\" aria-label=\"Language selection\">\n\t\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={lang}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handleChange(lang)}\n\t\t\t\t\t\taria-pressed={currentLanguage === lang}\n\t\t\t\t\t\tdata-active={currentLanguage === lang}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === \"minimal\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\t\t\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\t\t\t\thandleChange(availableLanguages[nextIndex]);\n\t\t\t\t}}\n\t\t\t\taria-label={`Current language: ${getLanguageInfo(currentLanguage).name}. Click to change.`}\n\t\t\t>\n\t\t\t\t{formatLanguageDisplay(currentLanguage, display)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<select\n\t\t\tvalue={currentLanguage}\n\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\tclassName={className}\n\t\t\taria-label=\"Select language\"\n\t\t>\n\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t<option key={lang} value={lang}>\n\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t</option>\n\t\t\t))}\n\t\t</select>\n\t);\n}\n","import { useCallback } from \"react\";\nimport { getTranslation, useTranslationStore } from \"../store\";\nimport type { CTFunction, InterpolationValues } from \"../types\";\n\nfunction isInterpolationValues(arg: unknown): arg is InterpolationValues {\n\treturn (\n\t\ttypeof arg === \"object\" &&\n\t\targ !== null &&\n\t\t!Array.isArray(arg) &&\n\t\t!(arg instanceof Date)\n\t);\n}\n\nexport function useCt(): CTFunction {\n\tconst { translations, currentLanguage } = useTranslationStore();\n\n\tconst ct = useCallback(\n\t\t(\n\t\t\ttext: string,\n\t\t\tcontextOrValues?: string | InterpolationValues,\n\t\t\tmaybeValues?: InterpolationValues,\n\t\t): string => {\n\t\t\tlet values: InterpolationValues | undefined;\n\n\t\t\tif (typeof contextOrValues === \"string\") {\n\t\t\t\tvalues = maybeValues;\n\t\t\t} else if (isInterpolationValues(contextOrValues)) {\n\t\t\t\tvalues = contextOrValues;\n\t\t\t}\n\n\t\t\treturn getTranslation(translations, currentLanguage, text, values);\n\t\t},\n\t\t[translations, currentLanguage],\n\t) as CTFunction;\n\n\treturn ct;\n}\n","import React, {\n\tcloneElement,\n\tisValidElement,\n\ttype ReactNode,\n\ttype ReactElement,\n} from \"react\";\nimport { useCt } from \"../hooks/useCt\";\nimport type { InterpolationValues } from \"../types\";\n\nfunction createTagRegex() {\n\treturn /<(\\d+)>(.*?)<\\/\\1>/gs;\n}\n\nexport interface TransProps {\n\tchildren: ReactNode;\n\tcontext?: string;\n\tvalues?: InterpolationValues;\n}\n\ninterface ParsedChild {\n\ttype: \"text\" | \"element\";\n\tcontent: string;\n\telement?: ReactElement;\n\tindex?: number;\n}\n\nfunction parseChildren(children: ReactNode): {\n\ttemplate: string;\n\telements: ReactElement[];\n} {\n\tconst elements: ReactElement[] = [];\n\tlet template = \"\";\n\n\tconst processNode = (node: ReactNode): string => {\n\t\tif (node === null || node === undefined) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (typeof node === \"string\") {\n\t\t\treturn node;\n\t\t}\n\n\t\tif (typeof node === \"number\") {\n\t\t\treturn String(node);\n\t\t}\n\n\t\tif (isValidElement(node)) {\n\t\t\tconst index = elements.length;\n\t\t\telements.push(node);\n\t\t\tconst innerContent = processNode(node.props.children);\n\t\t\treturn `<${index}>${innerContent}</${index}>`;\n\t\t}\n\n\t\tif (Array.isArray(node)) {\n\t\t\treturn node.map(processNode).join(\"\");\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\ttemplate = processNode(children);\n\treturn { template, elements };\n}\n\nfunction reconstructChildren(\n\ttranslated: string,\n\telements: ReactElement[],\n): ReactNode {\n\tif (elements.length === 0) {\n\t\treturn translated;\n\t}\n\n\tconst result: ReactNode[] = [];\n\tlet keyCounter = 0;\n\n\tlet lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\n\tconst tagRegex = createTagRegex();\n\n\twhile ((match = tagRegex.exec(translated)) !== null) {\n\t\t// Add text before the match\n\t\tif (match.index > lastIndex) {\n\t\t\tconst textBefore = translated.slice(lastIndex, match.index);\n\t\t\tif (textBefore) {\n\t\t\t\tresult.push(textBefore);\n\t\t\t}\n\t\t}\n\n\t\tconst elementIndex = parseInt(match[1], 10);\n\t\tconst innerContent = match[2];\n\t\tconst originalElement = elements[elementIndex];\n\n\t\tif (originalElement) {\n\t\t\t// Recursively process inner content in case of nested tags\n\t\t\tconst processedInner = reconstructChildren(innerContent, elements);\n\t\t\tconst cloned = cloneElement(originalElement, {\n\t\t\t\tkey: `trans-${keyCounter++}`,\n\t\t\t\tchildren: processedInner,\n\t\t\t});\n\t\t\tresult.push(cloned);\n\t\t}\n\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\n\t// Add remaining text after last match\n\tif (lastIndex < translated.length) {\n\t\tresult.push(translated.slice(lastIndex));\n\t}\n\n\t// If no matches found, return the original string\n\tif (result.length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn result.length === 1 ? result[0] : result;\n}\n\nexport function Trans({ children, context, values }: TransProps) {\n\tconst ct = useCt();\n\n\t// Parse children to extract template and elements\n\tconst { template, elements } = parseChildren(children);\n\n\t// Translate the template\n\tlet translated: string;\n\tif (context && values) {\n\t\ttranslated = ct(template, context, values);\n\t} else if (context) {\n\t\ttranslated = ct(template, context);\n\t} else if (values) {\n\t\ttranslated = ct(template, values);\n\t} else {\n\t\ttranslated = ct(template);\n\t}\n\n\t// Reconstruct with original elements\n\treturn <>{reconstructChildren(translated, elements)}</>;\n}\n","import { useCallback } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n} from \"../components/LanguageSwitcher\";\n\nexport function useCurrentLanguage(): string {\n\treturn useTranslationStore((state) => state.currentLanguage);\n}\n\nexport function useSetLanguage(): (language: string) => void {\n\treturn useTranslationStore((state) => state.setLanguage);\n}\n\nexport function useAvailableLanguages(): string[] {\n\treturn useTranslationStore((state) => state.availableLanguages);\n}\n\nexport function useIsLoading(): boolean {\n\treturn useTranslationStore((state) => state.isLoading);\n}\n\nexport function useIsReady(): boolean {\n\treturn useTranslationStore((state) => state.isReady);\n}\n\nexport function useLanguageInfo(code?: string): LanguageInfo {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst targetCode = code ?? currentLanguage;\n\treturn getFullLanguageInfo(targetCode);\n}\n\nexport function useAvailableLanguagesInfo(): LanguageInfo[] {\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\treturn availableLanguages.map(getFullLanguageInfo);\n}\n\nexport function useLanguage() {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst isLoading = useTranslationStore((state) => state.isLoading);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\n\tconst currentLanguageInfo = getFullLanguageInfo(currentLanguage);\n\tconst availableLanguagesInfo = availableLanguages.map(getFullLanguageInfo);\n\n\tconst cycleLanguage = useCallback(() => {\n\t\tif (availableLanguages.length === 0) {\n\t\t\tconsole.warn(\"[ciao-tools] Cannot cycle language: no languages available\");\n\t\t\treturn;\n\t\t}\n\t\tif (availableLanguages.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\tsetLanguage(availableLanguages[nextIndex]);\n\t}, [availableLanguages, currentLanguage, setLanguage]);\n\n\treturn {\n\t\tcurrentLanguage,\n\t\tcurrentLanguageInfo,\n\t\tavailableLanguages,\n\t\tavailableLanguagesInfo,\n\t\tsetLanguage,\n\t\tcycleLanguage,\n\t\tisLoading,\n\t\tisReady,\n\t};\n}\n\nexport function getCiaoLanguage(): string {\n\treturn useTranslationStore.getState().currentLanguage;\n}\n\nexport function getCiaoHeaders(): { \"X-Ciao-Language\": string } {\n\treturn {\n\t\t\"X-Ciao-Language\": useTranslationStore.getState().currentLanguage,\n\t};\n}\n\nexport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["options: Intl.DateTimeFormatOptions","result: string","key: string","format: string | undefined","hydrationResolver: (() => void) | null","dbPromise: Promise<IDBDatabase> | null","entry: CacheEntry","updatedLanguages: string[]","originalFetch: typeof fetch | null","LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n>","values: InterpolationValues | undefined","elements: ReactElement[]","result: ReactNode[]","match: RegExpExecArray | null","translated: string"],"sources":["../src/components/CTContextBlock.tsx","../src/interpolate.ts","../src/store.ts","../src/cache.ts","../src/hooks/useHotUpdates.ts","../src/hooks/useManifest.ts","../src/hooks/useTranslationLoader.ts","../src/utils/browserLanguage.ts","../src/hooks/useLanguageInit.ts","../src/hooks/usePreloader.ts","../src/fetchInterceptor.ts","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/hooks/useCt.ts","../src/components/Trans.tsx","../src/hooks/useLanguage.ts"],"sourcesContent":["import React from \"react\";\nimport type { CTContextBlockProps } from \"../types\";\n\nexport function CTContextBlock({ children }: CTContextBlockProps) {\n\treturn <>{children}</>;\n}\n","export type InterpolationValues = Record<string, unknown>;\n\nconst MAX_CACHE_SIZE = 100;\n\ninterface BoundedCache<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n\thas(key: K): boolean;\n\tclear(): void;\n}\n\nfunction createBoundedCache<K, V>(maxSize: number): BoundedCache<K, V> {\n\tconst cache = new Map<K, V>();\n\treturn {\n\t\tget(key: K): V | undefined {\n\t\t\treturn cache.get(key);\n\t\t},\n\t\tset(key: K, value: V): void {\n\t\t\tif (cache.size >= maxSize) {\n\t\t\t\tconst firstKey = cache.keys().next().value;\n\t\t\t\tif (firstKey !== undefined) {\n\t\t\t\t\tcache.delete(firstKey);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcache.set(key, value);\n\t\t},\n\t\thas(key: K): boolean {\n\t\t\treturn cache.has(key);\n\t\t},\n\t\tclear(): void {\n\t\t\tcache.clear();\n\t\t},\n\t};\n}\n\nconst numberFormatCache = createBoundedCache<string, Intl.NumberFormat>(MAX_CACHE_SIZE);\nconst dateFormatCache = createBoundedCache<string, Intl.DateTimeFormat>(MAX_CACHE_SIZE);\nconst pluralRulesCache = createBoundedCache<string, Intl.PluralRules>(MAX_CACHE_SIZE);\n\nexport function clearFormatterCache(): void {\n\tnumberFormatCache.clear();\n\tdateFormatCache.clear();\n\tpluralRulesCache.clear();\n}\n\nfunction getNumberFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `number:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tmaximumFractionDigits: 20,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getCurrencyFormatter(\n\tlocale: string,\n\tcurrency: string,\n): Intl.NumberFormat {\n\tconst key = `currency:${locale}:${currency}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getPercentFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `percent:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"percent\",\n\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getDateFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `date:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\tdateStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getTimeFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `time:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\ttimeStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getPluralRules(locale: string): Intl.PluralRules {\n\tif (!pluralRulesCache.has(locale)) {\n\t\tpluralRulesCache.set(locale, new Intl.PluralRules(locale));\n\t}\n\treturn pluralRulesCache.get(locale)!;\n}\n\nexport function formatValue(\n\tvalue: unknown,\n\tformat: string | undefined,\n\tlocale: string,\n): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\n\tif (!format) {\n\t\treturn String(value);\n\t}\n\n\tconst parts = format.split(\":\");\n\tconst formatType = parts[0];\n\n\tswitch (formatType) {\n\t\tcase \"number\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getNumberFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"currency\": {\n\t\t\tconst currency = parts[1];\n\t\t\tif (!currency) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getCurrencyFormatter(locale, currency).format(num);\n\t\t}\n\n\t\tcase \"percent\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getPercentFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"date\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getDateFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"time\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getTimeFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"plural\": {\n\t\t\tconst singular = parts[1];\n\t\t\tconst plural = parts[2];\n\t\t\tif (!singular || !plural) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tconst rules = getPluralRules(locale);\n\t\t\tconst category = rules.select(num);\n\t\t\treturn category === \"one\" ? singular : plural;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\nexport function interpolate(\n\ttext: string,\n\tvalues: InterpolationValues | undefined,\n\tlocale: string,\n): string {\n\tconst escaped = text.replace(/\\{\\{/g, \"\\x00\").replace(/\\}\\}/g, \"\\x01\");\n\n\tlet result: string;\n\tif (!values || Object.keys(values).length === 0) {\n\t\tresult = escaped;\n\t} else {\n\t\tresult = escaped.replace(/\\{([^}]+)\\}/g, (match, placeholder) => {\n\t\t\tconst trimmed = placeholder.trim();\n\t\t\tconst colonIndex = trimmed.indexOf(\":\");\n\n\t\t\tlet key: string;\n\t\t\tlet format: string | undefined;\n\n\t\t\tif (colonIndex === -1) {\n\t\t\t\tkey = trimmed;\n\t\t\t\tformat = undefined;\n\t\t\t} else {\n\t\t\t\tkey = trimmed.substring(0, colonIndex);\n\t\t\t\tformat = trimmed.substring(colonIndex + 1);\n\t\t\t}\n\n\t\t\tif (!(key in values)) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tconst value = values[key];\n\t\t\treturn formatValue(value, format, locale);\n\t\t});\n\t}\n\n\treturn result.replace(/\\x00/g, \"{\").replace(/\\x01/g, \"}\");\n}\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { interpolate } from \"./interpolate\";\nimport type {\n\tInterpolationValues,\n\tLanguageTranslations,\n\tStoredManifest,\n\tTranslationMap,\n\tTranslationStore,\n} from \"./types\";\n\nlet hydrationResolver: (() => void) | null = null;\nconst hydrationPromise = new Promise<void>((resolve) => {\n\thydrationResolver = resolve;\n});\n\nexport const useTranslationStore = create<TranslationStore>()(\n\tpersist(\n\t\t(set) => ({\n\t\t\tcurrentLanguage: \"en\",\n\t\t\tdefaultLanguage: \"en\",\n\t\t\tavailableLanguages: [\"en\"],\n\t\t\ttranslations: {},\n\t\t\tisLoading: false,\n\t\t\tisReady: false,\n\t\t\tisHydrated: false,\n\t\t\tstoredManifest: null,\n\t\t\tlastVersionCheck: null,\n\n\t\t\tsetLanguage: (language: string) => {\n\t\t\t\tset({ currentLanguage: language, isReady: false });\n\t\t\t},\n\n\t\t\tloadTranslations: (translations: LanguageTranslations) => {\n\t\t\t\tset((state) => {\n\t\t\t\t\tconst languages = Object.keys(translations);\n\t\t\t\t\tconst availableLanguages = [\n\t\t\t\t\t\t...new Set([...state.availableLanguages, ...languages]),\n\t\t\t\t\t];\n\t\t\t\t\tconst merged = { ...state.translations };\n\t\t\t\t\tfor (const lang of languages) {\n\t\t\t\t\t\tmerged[lang] = { ...merged[lang], ...translations[lang] };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttranslations: merged,\n\t\t\t\t\t\tavailableLanguages,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\n\t\t\taddLanguage: (language: string, translations: TranslationMap) => {\n\t\t\t\tset((state) => ({\n\t\t\t\t\ttranslations: {\n\t\t\t\t\t\t...state.translations,\n\t\t\t\t\t\t[language]: { ...state.translations[language], ...translations },\n\t\t\t\t\t},\n\t\t\t\t\tavailableLanguages: state.availableLanguages.includes(language)\n\t\t\t\t\t\t? state.availableLanguages\n\t\t\t\t\t\t: [...state.availableLanguages, language],\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tsetLoading: (loading: boolean) => {\n\t\t\t\tset({ isLoading: loading });\n\t\t\t},\n\n\t\t\tsetReady: (ready: boolean) => {\n\t\t\t\tset({ isReady: ready });\n\t\t\t},\n\n\t\t\tsetStoredManifest: (manifest: StoredManifest) => {\n\t\t\t\tset({ storedManifest: manifest, lastVersionCheck: Date.now() });\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: \"ciao-tools-language\",\n\t\t\tpartialize: (state) => ({\n\t\t\t\tcurrentLanguage: state.currentLanguage,\n\t\t\t\tstoredManifest: state.storedManifest,\n\t\t\t}),\n\t\t\tonRehydrateStorage: () => (_, error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconsole.error(\"[ciao-tools] Storage hydration failed:\", error);\n\t\t\t\t}\n\t\t\t\tif (hydrationResolver) {\n\t\t\t\t\thydrationResolver();\n\t\t\t\t\thydrationResolver = null;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t),\n);\n\nhydrationPromise.then(() => {\n\tuseTranslationStore.setState({ isHydrated: true });\n});\n\nexport function getTranslation(\n\ttranslations: LanguageTranslations,\n\tlanguage: string,\n\ttext: string,\n\tvalues?: InterpolationValues,\n): string {\n\tconst translated = translations[language]?.[text] ?? text;\n\n\tif (!values || Object.keys(values).length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn interpolate(translated, values, language);\n}\n","import type { TranslationMap } from \"./types\";\n\nconst DB_NAME = \"ciao-tools-translations\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"translations\";\n\ninterface CacheEntry {\n\tlanguage: string;\n\tprojectId: string;\n\tdata: TranslationMap;\n\turl: string;\n\tcachedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDB(): Promise<IDBDatabase> {\n\tif (dbPromise) return dbPromise;\n\n\tdbPromise = new Promise((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\tdbPromise = null;\n\t\t\treject(new Error(\"IndexedDB not available\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst request = indexedDB.open(DB_NAME, DB_VERSION);\n\n\t\trequest.onerror = () => {\n\t\t\tdbPromise = null;\n\t\t\treject(request.error);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\t\t\tif (!db.objectStoreNames.contains(STORE_NAME)) {\n\t\t\t\tconst store = db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n\t\t\t\tstore.createIndex(\"language\", \"language\", { unique: false });\n\t\t\t\tstore.createIndex(\"projectId\", \"projectId\", { unique: false });\n\t\t\t}\n\t\t};\n\t});\n\n\treturn dbPromise;\n}\n\nexport async function getCachedTranslation(\n\turl: string,\n): Promise<TranslationMap | null> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\t\t\tconst request = store.get(url);\n\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst entry = request.result as CacheEntry | undefined;\n\t\t\t\tresolve(entry?.data ?? null);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to read from cache:\", error);\n\t\treturn null;\n\t}\n}\n\nexport async function cacheTranslation(\n\turl: string,\n\tlanguage: string,\n\tprojectId: string,\n\tdata: TranslationMap,\n): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst entry: CacheEntry = {\n\t\t\t\turl,\n\t\t\t\tlanguage,\n\t\t\t\tprojectId,\n\t\t\t\tdata,\n\t\t\t\tcachedAt: Date.now(),\n\t\t\t};\n\n\t\t\tconst request = store.put(entry);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => resolve();\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to write to cache:\", error);\n\t}\n}\n\nexport async function clearCache(projectId?: string): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tif (projectId) {\n\t\t\t\tconst index = store.index(\"projectId\");\n\t\t\t\tconst request = index.openCursor(IDBKeyRange.only(projectId));\n\t\t\t\trequest.onsuccess = (event) => {\n\t\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\tcursor.delete();\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => resolve();\n\t\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t\t} else {\n\t\t\t\tconst request = store.clear();\n\t\t\t\trequest.onerror = () => reject(request.error);\n\t\t\t\trequest.onsuccess = () => resolve();\n\t\t\t}\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to clear cache:\", error);\n\t}\n}\n\nexport async function getCacheStats(): Promise<{\n\tcount: number;\n\tlanguages: string[];\n}> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst countRequest = store.count();\n\t\t\tconst languages = new Set<string>();\n\n\t\t\tconst cursorRequest = store.openCursor();\n\t\t\tcursorRequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tlanguages.add((cursor.value as CacheEntry).language);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttransaction.oncomplete = () => {\n\t\t\t\tresolve({\n\t\t\t\t\tcount: countRequest.result,\n\t\t\t\t\tlanguages: Array.from(languages),\n\t\t\t\t});\n\t\t\t};\n\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to get cache stats:\", error);\n\t\treturn { count: 0, languages: [] };\n\t}\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { clearCache, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { HotUpdateConfig, StoredManifest, TranslationMap } from \"../types\";\n\nconst CDN_BASE_URL = \"https://t1.ciao-tools.com\";\n\ninterface LatestManifest {\n\tversion: number;\n\tupdatedAt: string;\n\turls: Record<string, string>;\n}\n\nasync function fetchLatestManifest(projectId: string): Promise<LatestManifest | null> {\n\tconst url = `${CDN_BASE_URL}/translations/${projectId}/latest.json`;\n\ttry {\n\t\tconst response = await fetch(url, { cache: \"no-cache\" });\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to fetch latest manifest: ${response.statusText}`);\n\t\t}\n\t\treturn response.json();\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to fetch latest manifest:\", error);\n\t\treturn null;\n\t}\n}\n\nasync function fetchTranslations(url: string): Promise<TranslationMap> {\n\tconst response = await fetch(url);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useHotUpdates(\n\tconfig: HotUpdateConfig | undefined,\n\tprojectId: string | undefined,\n\tsourceLanguage: string | undefined,\n) {\n\tconst isCheckingRef = useRef(false);\n\tconst hasCheckedOnMountRef = useRef(false);\n\n\tconst configRef = useRef(config);\n\tconst projectIdRef = useRef(projectId);\n\tconst sourceLanguageRef = useRef(sourceLanguage);\n\n\tuseEffect(() => {\n\t\tconfigRef.current = config;\n\t\tprojectIdRef.current = projectId;\n\t\tsourceLanguageRef.current = sourceLanguage;\n\t}, [config, projectId, sourceLanguage]);\n\n\tconst { setStoredManifest, addLanguage } = useTranslationStore();\n\n\tconst checkForUpdates = useCallback(async () => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\t\tconst currentSourceLanguage = sourceLanguageRef.current;\n\n\t\tif (!currentConfig || !currentProjectId || isCheckingRef.current) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tisCheckingRef.current = true;\n\n\t\ttry {\n\t\t\tconsole.log(\"[ciao-tools] Checking for hot updates...\");\n\t\t\tconst latestManifest = await fetchLatestManifest(currentProjectId);\n\n\t\t\tif (!latestManifest) {\n\t\t\t\tconsole.log(\"[ciao-tools] No latest.json found (project may not have hot updates yet)\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\"[ciao-tools] Found latest.json, version:\", latestManifest.version);\n\n\t\t\tconst currentManifest = useTranslationStore.getState().storedManifest;\n\t\t\tconst currentVersion = currentManifest?.serverVersion ?? null;\n\t\t\tconst isFirstCheck = currentVersion === null;\n\t\t\tconst hasNewVersion = currentVersion !== null && latestManifest.version > currentVersion;\n\n\t\t\tif (isFirstCheck || hasNewVersion) {\n\t\t\t\tif (Object.keys(latestManifest.urls).length > 0) {\n\t\t\t\t\tconst reason = hasNewVersion ? \"new version\" : \"first check\";\n\t\t\t\t\tconsole.log(`[ciao-tools] Fetching translations (${reason})...`);\n\n\t\t\t\t\tif (hasNewVersion) {\n\t\t\t\t\t\tawait clearCache(currentProjectId);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst updatedLanguages: string[] = [];\n\n\t\t\t\t\tfor (const [langCode, url] of Object.entries(latestManifest.urls)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst translations = await fetchTranslations(url);\n\t\t\t\t\t\t\taddLanguage(langCode, translations);\n\t\t\t\t\t\t\tawait cacheTranslation(url, langCode, currentProjectId, translations);\n\t\t\t\t\t\t\tupdatedLanguages.push(langCode);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(`[ciao-tools] Failed to fetch ${langCode} translations:`, err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedLanguages.length > 0) {\n\t\t\t\t\t\tconsole.log(\"[ciao-tools] Updated translations for:\", updatedLanguages);\n\t\t\t\t\t\tif (hasNewVersion && currentConfig.onTranslationsUpdated) {\n\t\t\t\t\t\t\tcurrentConfig.onTranslationsUpdated(updatedLanguages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newStoredManifest: StoredManifest = {\n\t\t\t\t\tserverVersion: latestManifest.version,\n\t\t\t\t\tupdatedAt: latestManifest.updatedAt,\n\t\t\t\t\tprojectId: currentProjectId,\n\t\t\t\t\tsourceLanguage: currentManifest?.sourceLanguage ?? currentSourceLanguage ?? \"en\",\n\t\t\t\t\tlanguages: Object.keys(latestManifest.urls),\n\t\t\t\t\tcdnUrls: latestManifest.urls,\n\t\t\t\t};\n\n\t\t\t\tsetStoredManifest(newStoredManifest);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"[ciao-tools] Already up to date (version \" + latestManifest.version + \")\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[ciao-tools] Hot update check failed:\", error);\n\t\t} finally {\n\t\t\tisCheckingRef.current = false;\n\t\t}\n\t}, [setStoredManifest, addLanguage]);\n\n\tuseEffect(() => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\n\t\tif (!currentConfig || !currentProjectId) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tif (!hasCheckedOnMountRef.current) {\n\t\t\thasCheckedOnMountRef.current = true;\n\t\t\tcheckForUpdates();\n\t\t}\n\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (document.visibilityState === \"visible\") {\n\t\t\t\tcheckForUpdates();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\t};\n\t}, [checkForUpdates]);\n\n\treturn { checkForUpdates };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, StoredManifest } from \"../types\";\n\nexport interface UseManifestOptions {\n\tmanifest?: CiaoManifest;\n}\n\nexport interface UseManifestResult {\n\teffectiveManifest: CiaoManifest | undefined;\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\thasManifestChanged: boolean;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n}\n\nfunction getManifestUrlsHash(manifest: CiaoManifest | undefined): string {\n\tif (!manifest) return \"\";\n\treturn JSON.stringify(manifest.cdnUrls);\n}\n\nexport function useManifest({ manifest }: UseManifestOptions): UseManifestResult {\n\tconst storedManifest = useTranslationStore((state) => state.storedManifest);\n\n\tconst effectiveManifest = useMemo((): CiaoManifest | undefined => {\n\t\tif (storedManifest && storedManifest.projectId === manifest?.projectId) {\n\t\t\treturn {\n\t\t\t\tversion: String(storedManifest.serverVersion),\n\t\t\t\tprojectId: storedManifest.projectId,\n\t\t\t\tsourceLanguage: storedManifest.sourceLanguage,\n\t\t\t\tlanguages: storedManifest.languages,\n\t\t\t\tcdnUrls: storedManifest.cdnUrls,\n\t\t\t\tgeneratedAt: storedManifest.updatedAt,\n\t\t\t};\n\t\t}\n\t\treturn manifest;\n\t}, [storedManifest, manifest]);\n\n\tconst manifestRef = useRef<CiaoManifest | undefined>(effectiveManifest);\n\tconst previousManifestHashRef = useRef<string>(\"\");\n\tconst loadedUrlsRef = useRef<Map<string, string>>(new Map());\n\tconst hasManifestChangedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tmanifestRef.current = effectiveManifest;\n\n\t\tconst newHash = getManifestUrlsHash(effectiveManifest);\n\t\tconst oldHash = previousManifestHashRef.current;\n\n\t\tif (oldHash && newHash && oldHash !== newHash) {\n\t\t\tloadedUrlsRef.current.clear();\n\t\t\tuseTranslationStore.setState({ translations: {} });\n\t\t\thasManifestChangedRef.current = true;\n\t\t} else {\n\t\t\thasManifestChangedRef.current = false;\n\t\t}\n\n\t\tpreviousManifestHashRef.current = newHash;\n\t}, [effectiveManifest]);\n\n\treturn {\n\t\teffectiveManifest,\n\t\tmanifestRef,\n\t\thasManifestChanged: hasManifestChangedRef.current,\n\t\tloadedUrlsRef,\n\t};\n}\n","import { useCallback, useRef } from \"react\";\nimport { getCachedTranslation, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, TranslationMap } from \"../types\";\n\nexport interface UseTranslationLoaderOptions {\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n\thotUpdatesEnabled?: boolean;\n}\n\nexport interface UseTranslationLoaderResult {\n\tloadLanguage: (language: string, isPreload?: boolean) => Promise<boolean>;\n\tabortControllerRef: React.RefObject<AbortController | null>;\n}\n\nasync function fetchTranslationsFromCDN(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<TranslationMap> {\n\tconst response = await fetch(url, { signal });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useTranslationLoader({\n\tmanifestRef,\n\tloadedUrlsRef,\n\thotUpdatesEnabled,\n}: UseTranslationLoaderOptions): UseTranslationLoaderResult {\n\tconst addLanguage = useTranslationStore((state) => state.addLanguage);\n\tconst setLoading = useTranslationStore((state) => state.setLoading);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst loadLanguage = useCallback(\n\t\tasync (language: string, isPreload = false): Promise<boolean> => {\n\t\t\tconst currentManifest = manifestRef.current;\n\t\t\tif (!currentManifest) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst cdnUrl = currentManifest.cdnUrls[language];\n\n\t\t\tif (!cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst loadedUrl = loadedUrlsRef.current.get(language);\n\t\t\tif (loadedUrl === cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!isPreload) {\n\t\t\t\tif (abortControllerRef.current) {\n\t\t\t\t\tabortControllerRef.current.abort();\n\t\t\t\t}\n\t\t\t\tabortControllerRef.current = new AbortController();\n\t\t\t}\n\n\t\t\tconst controller = isPreload ? undefined : abortControllerRef.current;\n\n\t\t\tif (!isPreload) {\n\t\t\t\tsetLoading(true);\n\t\t\t\tsetReady(false);\n\t\t\t}\n\n\t\t\tconst useCache = hotUpdatesEnabled !== true;\n\n\t\t\ttry {\n\t\t\t\tif (useCache) {\n\t\t\t\t\tconst cached = await getCachedTranslation(cdnUrl);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\tif (controller?.signal.aborted) return false;\n\t\t\t\t\t\taddLanguage(language, cached);\n\t\t\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\t\t\t\t\t\tif (!isPreload) {\n\t\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst translationData = await fetchTranslationsFromCDN(\n\t\t\t\t\tcdnUrl,\n\t\t\t\t\tcontroller?.signal,\n\t\t\t\t);\n\n\t\t\t\tif (controller?.signal.aborted) return false;\n\n\t\t\t\taddLanguage(language, translationData);\n\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\n\t\t\t\tif (useCache) {\n\t\t\t\t\tawait cacheTranslation(\n\t\t\t\t\t\tcdnUrl,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tcurrentManifest.projectId,\n\t\t\t\t\t\ttranslationData,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[ciao-tools] Failed to load translations for ${language}:`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tif (!isPreload) setLoading(false);\n\t\t\t}\n\t\t},\n\t\t[manifestRef, loadedUrlsRef, hotUpdatesEnabled, addLanguage, setLoading, setReady],\n\t);\n\n\treturn { loadLanguage, abortControllerRef };\n}\n","export function detectBrowserLanguage(availableLanguages: string[]): string | null {\n\tif (typeof navigator === \"undefined\") return null;\n\n\tconst browserLangs = navigator.languages || [navigator.language];\n\n\tfor (const browserLang of browserLangs) {\n\t\tconst normalized = browserLang.toLowerCase();\n\t\tif (availableLanguages.includes(normalized)) {\n\t\t\treturn normalized;\n\t\t}\n\t\tconst langCode = normalized.split(\"-\")[0];\n\t\tif (availableLanguages.includes(langCode)) {\n\t\t\treturn langCode;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { detectBrowserLanguage } from \"../utils/browserLanguage\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UseLanguageInitOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tavailableLanguages?: string[];\n\tdefaultLanguage: string;\n\tdetectLanguage: boolean;\n}\n\nexport function useLanguageInit({\n\teffectiveManifest,\n\tavailableLanguages,\n\tdefaultLanguage,\n\tdetectLanguage,\n}: UseLanguageInitOptions): void {\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst initializedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\t\tif (initializedRef.current) return;\n\t\tinitializedRef.current = true;\n\n\t\tconst store = useTranslationStore.getState();\n\t\tconst effectiveLanguages = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages || [];\n\n\t\tconst hasPersistedLanguage =\n\t\t\tstore.currentLanguage &&\n\t\t\tstore.currentLanguage !== \"en\" &&\n\t\t\teffectiveLanguages.includes(store.currentLanguage);\n\n\t\tif (hasPersistedLanguage) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (detectLanguage && effectiveLanguages.length > 0) {\n\t\t\tconst detected = detectBrowserLanguage(effectiveLanguages);\n\t\t\tif (detected) {\n\t\t\t\tsetLanguage(detected);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (defaultLanguage && defaultLanguage !== store.currentLanguage) {\n\t\t\tsetLanguage(defaultLanguage);\n\t\t}\n\t}, [\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t\tsetLanguage,\n\t\tisHydrated,\n\t]);\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UsePreloaderOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tcurrentLanguage: string;\n\tdelay: number;\n\tenabled: boolean;\n\tloadLanguage: (language: string, isPreload: boolean) => Promise<boolean>;\n}\n\nexport function usePreloader({\n\teffectiveManifest,\n\tcurrentLanguage,\n\tdelay,\n\tenabled,\n\tloadLanguage,\n}: UsePreloaderOptions): void {\n\tconst preloadTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst isMountedRef = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMountedRef.current = true;\n\t\treturn () => {\n\t\t\tisMountedRef.current = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!enabled || !effectiveManifest) return;\n\n\t\tif (preloadTimeoutRef.current) {\n\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t}\n\n\t\tpreloadTimeoutRef.current = setTimeout(async () => {\n\t\t\tif (!isMountedRef.current) return;\n\n\t\t\tconst languages = [...effectiveManifest.languages];\n\t\t\tfor (const language of languages) {\n\t\t\t\tif (!isMountedRef.current) break;\n\t\t\t\tif (language === effectiveManifest.sourceLanguage) continue;\n\t\t\t\tif (language === currentLanguage) continue;\n\n\t\t\t\tawait loadLanguage(language, true);\n\t\t\t}\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tif (preloadTimeoutRef.current) {\n\t\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, [effectiveManifest, currentLanguage, enabled, delay, loadLanguage]);\n}\n","import { useTranslationStore } from \"./store\";\n\nlet originalFetch: typeof fetch | null = null;\nlet isPatched = false;\n\nfunction getHeaders(): { \"X-Ciao-Language\": string; \"Accept-Language\": string } {\n\tconst currentLanguage = useTranslationStore.getState().currentLanguage;\n\tconst defaultLanguage = useTranslationStore.getState().defaultLanguage;\n\n\tlet acceptLanguage = currentLanguage;\n\tif (defaultLanguage && defaultLanguage !== currentLanguage) {\n\t\tacceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;\n\t}\n\n\treturn {\n\t\t\"X-Ciao-Language\": currentLanguage,\n\t\t\"Accept-Language\": acceptLanguage,\n\t};\n}\n\nexport function patchGlobalFetch(): void {\n\tif (typeof window === \"undefined\" || typeof fetch === \"undefined\") {\n\t\treturn;\n\t}\n\n\tif (isPatched) {\n\t\treturn;\n\t}\n\n\toriginalFetch = window.fetch;\n\tisPatched = true;\n\n\twindow.fetch = function (\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit,\n\t): Promise<Response> {\n\t\tconst headers = getHeaders();\n\t\tconst mergedHeaders = new Headers(init?.headers);\n\n\t\tif (!mergedHeaders.has(\"X-Ciao-Language\")) {\n\t\t\tmergedHeaders.set(\"X-Ciao-Language\", headers[\"X-Ciao-Language\"]);\n\t\t}\n\t\tif (!mergedHeaders.has(\"Accept-Language\")) {\n\t\t\tmergedHeaders.set(\"Accept-Language\", headers[\"Accept-Language\"]);\n\t\t}\n\n\t\treturn originalFetch!(input, {\n\t\t\t...init,\n\t\t\theaders: mergedHeaders,\n\t\t});\n\t};\n}\n\nexport function unpatchGlobalFetch(): void {\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\n\tif (!isPatched || !originalFetch) {\n\t\treturn;\n\t}\n\n\twindow.fetch = originalFetch;\n\toriginalFetch = null;\n\tisPatched = false;\n}\n\nexport function isFetchPatched(): boolean {\n\treturn isPatched;\n}\n","import React, { useEffect } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { useHotUpdates } from \"../hooks/useHotUpdates\";\nimport { useManifest } from \"../hooks/useManifest\";\nimport { useTranslationLoader } from \"../hooks/useTranslationLoader\";\nimport { useLanguageInit } from \"../hooks/useLanguageInit\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport { patchGlobalFetch, unpatchGlobalFetch } from \"../fetchInterceptor\";\nimport type { CiaoProviderProps } from \"../types\";\n\nconst PRELOAD_DELAY_MS = 5000;\n\nexport function CiaoProvider({\n\tchildren,\n\ttranslations,\n\tmanifest,\n\tdefaultLanguage = \"en\",\n\tavailableLanguages,\n\tonLanguageChange,\n\tdetectLanguage = true,\n\tblockUntilReady = true,\n\tfallback = null,\n\tpreloadLanguages = true,\n\tpreloadDelay = PRELOAD_DELAY_MS,\n\thotUpdates = { enabled: true },\n\tautoInjectHeaders = true,\n}: CiaoProviderProps) {\n\tconst loadTranslations = useTranslationStore((state) => state.loadTranslations);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\n\tconst { effectiveManifest, manifestRef, loadedUrlsRef } = useManifest({ manifest });\n\n\tconst { loadLanguage, abortControllerRef } = useTranslationLoader({\n\t\tmanifestRef,\n\t\tloadedUrlsRef,\n\t\thotUpdatesEnabled: hotUpdates?.enabled,\n\t});\n\n\tuseLanguageInit({\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t});\n\n\tusePreloader({\n\t\teffectiveManifest,\n\t\tcurrentLanguage,\n\t\tdelay: preloadDelay,\n\t\tenabled: preloadLanguages,\n\t\tloadLanguage,\n\t});\n\n\tuseHotUpdates(hotUpdates, manifest?.projectId, manifest?.sourceLanguage);\n\n\tuseEffect(() => {\n\t\tif (translations) {\n\t\t\tloadTranslations(translations);\n\t\t\tsetReady(true);\n\t\t}\n\t}, [translations, loadTranslations, setReady]);\n\n\tuseEffect(() => {\n\t\tconst languagesList = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages;\n\n\t\tif (languagesList) {\n\t\t\tconst store = useTranslationStore.getState();\n\t\t\tconst merged = [\n\t\t\t\t...new Set([...store.availableLanguages, ...languagesList]),\n\t\t\t];\n\t\t\tuseTranslationStore.setState({\n\t\t\t\tavailableLanguages: merged,\n\t\t\t\tdefaultLanguage,\n\t\t\t});\n\t\t}\n\t}, [availableLanguages, effectiveManifest, defaultLanguage]);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentLanguage === effectiveManifest?.sourceLanguage) {\n\t\t\tsetReady(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (effectiveManifest && currentLanguage) {\n\t\t\tloadLanguage(currentLanguage, false);\n\t\t} else if (!effectiveManifest) {\n\t\t\tsetReady(true);\n\t\t}\n\t}, [effectiveManifest, currentLanguage, loadLanguage, setReady, isHydrated]);\n\n\tuseEffect(() => {\n\t\tif (onLanguageChange) {\n\t\t\tonLanguageChange(currentLanguage);\n\t\t}\n\t}, [currentLanguage, onLanguageChange]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t};\n\t}, [abortControllerRef]);\n\n\tuseEffect(() => {\n\t\tif (autoInjectHeaders) {\n\t\t\tpatchGlobalFetch();\n\t\t}\n\t\treturn () => {\n\t\t\tif (autoInjectHeaders) {\n\t\t\t\tunpatchGlobalFetch();\n\t\t\t}\n\t\t};\n\t}, [autoInjectHeaders]);\n\n\tif (blockUntilReady && (!isReady || !isHydrated)) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn <>{children}</>;\n}\n","import React, { createContext, useContext, useCallback, type ReactNode } from \"react\";\nimport { useTranslationStore } from \"../store\";\n\nexport const LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n> = {\n\ten: { name: \"English\", nativeName: \"English\", flag: \"🇺🇸\" },\n\tes: { name: \"Spanish\", nativeName: \"Español\", flag: \"🇪🇸\" },\n\tfr: { name: \"French\", nativeName: \"Français\", flag: \"🇫🇷\" },\n\tde: { name: \"German\", nativeName: \"Deutsch\", flag: \"🇩🇪\" },\n\tit: { name: \"Italian\", nativeName: \"Italiano\", flag: \"🇮🇹\" },\n\tpt: { name: \"Portuguese\", nativeName: \"Português\", flag: \"🇵🇹\" },\n\tja: { name: \"Japanese\", nativeName: \"日本語\", flag: \"🇯🇵\" },\n\tko: { name: \"Korean\", nativeName: \"한국어\", flag: \"🇰🇷\" },\n\tzh: { name: \"Chinese\", nativeName: \"中文\", flag: \"🇨🇳\" },\n\tar: { name: \"Arabic\", nativeName: \"العربية\", flag: \"🇸🇦\" },\n\tru: { name: \"Russian\", nativeName: \"Русский\", flag: \"🇷🇺\" },\n\tnl: { name: \"Dutch\", nativeName: \"Nederlands\", flag: \"🇳🇱\" },\n\tpl: { name: \"Polish\", nativeName: \"Polski\", flag: \"🇵🇱\" },\n\tsv: { name: \"Swedish\", nativeName: \"Svenska\", flag: \"🇸🇪\" },\n\tda: { name: \"Danish\", nativeName: \"Dansk\", flag: \"🇩🇰\" },\n\tfi: { name: \"Finnish\", nativeName: \"Suomi\", flag: \"🇫🇮\" },\n\tno: { name: \"Norwegian\", nativeName: \"Norsk\", flag: \"🇳🇴\" },\n\ttr: { name: \"Turkish\", nativeName: \"Türkçe\", flag: \"🇹🇷\" },\n\tcs: { name: \"Czech\", nativeName: \"Čeština\", flag: \"🇨🇿\" },\n\tel: { name: \"Greek\", nativeName: \"Ελληνικά\", flag: \"🇬🇷\" },\n\the: { name: \"Hebrew\", nativeName: \"עברית\", flag: \"🇮🇱\" },\n\thu: { name: \"Hungarian\", nativeName: \"Magyar\", flag: \"🇭🇺\" },\n\tid: { name: \"Indonesian\", nativeName: \"Bahasa Indonesia\", flag: \"🇮🇩\" },\n\tth: { name: \"Thai\", nativeName: \"ไทย\", flag: \"🇹🇭\" },\n\tvi: { name: \"Vietnamese\", nativeName: \"Tiếng Việt\", flag: \"🇻🇳\" },\n\tuk: { name: \"Ukrainian\", nativeName: \"Українська\", flag: \"🇺🇦\" },\n\tro: { name: \"Romanian\", nativeName: \"Română\", flag: \"🇷🇴\" },\n\tbg: { name: \"Bulgarian\", nativeName: \"Български\", flag: \"🇧🇬\" },\n\tsk: { name: \"Slovak\", nativeName: \"Slovenčina\", flag: \"🇸🇰\" },\n\tlt: { name: \"Lithuanian\", nativeName: \"Lietuvių\", flag: \"🇱🇹\" },\n\tlv: { name: \"Latvian\", nativeName: \"Latviešu\", flag: \"🇱🇻\" },\n\tet: { name: \"Estonian\", nativeName: \"Eesti\", flag: \"🇪🇪\" },\n\tsl: { name: \"Slovenian\", nativeName: \"Slovenščina\", flag: \"🇸🇮\" },\n\tbs: { name: \"Bosnian\", nativeName: \"Bosanski\", flag: \"🇧🇦\" },\n\thr: { name: \"Croatian\", nativeName: \"Hrvatski\", flag: \"🇭🇷\" },\n\tsr: { name: \"Serbian\", nativeName: \"Српски\", flag: \"🇷🇸\" },\n\tkmr: { name: \"Kurdish\", nativeName: \"Kurdî\", flag: \"🇮🇶\" },\n\tfa: { name: \"Persian\", nativeName: \"فارسی\", flag: \"🇮🇷\" },\n\thi: { name: \"Hindi\", nativeName: \"हिन्दी\", flag: \"🇮🇳\" },\n\tbn: { name: \"Bengali\", nativeName: \"বাংলা\", flag: \"🇧🇩\" },\n\tms: { name: \"Malay\", nativeName: \"Bahasa Melayu\", flag: \"🇲🇾\" },\n};\n\nexport interface LanguageInfo {\n\tcode: string;\n\tname: string;\n\tnativeName: string;\n\tflag: string;\n}\n\nexport function getLanguageInfo(code: string): Omit<LanguageInfo, \"code\"> {\n\tconst normalized = code.toLowerCase();\n\treturn (\n\t\tLANGUAGE_DATA[normalized] ?? {\n\t\t\tname: code.toUpperCase(),\n\t\t\tnativeName: code.toUpperCase(),\n\t\t\tflag: \"🌐\",\n\t\t}\n\t);\n}\n\nexport function getFullLanguageInfo(code: string): LanguageInfo {\n\treturn {\n\t\tcode,\n\t\t...getLanguageInfo(code),\n\t};\n}\n\nexport type LanguageSwitcherDisplay =\n\t| \"flag\"\n\t| \"name\"\n\t| \"native\"\n\t| \"flag-name\"\n\t| \"flag-native\"\n\t| \"code\";\n\nexport function formatLanguageDisplay(\n\tcode: string,\n\tdisplay: LanguageSwitcherDisplay = \"flag-native\",\n): string {\n\tconst info = getLanguageInfo(code);\n\tswitch (display) {\n\t\tcase \"flag\":\n\t\t\treturn info.flag;\n\t\tcase \"name\":\n\t\t\treturn info.name;\n\t\tcase \"native\":\n\t\t\treturn info.nativeName;\n\t\tcase \"flag-name\":\n\t\t\treturn `${info.flag} ${info.name}`;\n\t\tcase \"flag-native\":\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t\tcase \"code\":\n\t\t\treturn code.toUpperCase();\n\t\tdefault:\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t}\n}\n\n// Simple default LanguageSwitcher (backward compatible)\nexport type LanguageSwitcherVariant = \"dropdown\" | \"buttons\" | \"minimal\";\n\nexport interface LanguageSwitcherProps {\n\tclassName?: string;\n\tvariant?: LanguageSwitcherVariant;\n\tdisplay?: LanguageSwitcherDisplay;\n\tonChange?: (language: string) => void;\n}\n\nexport default function LanguageSwitcher({\n\tclassName,\n\tvariant = \"dropdown\",\n\tdisplay = \"flag-native\",\n\tonChange,\n}: LanguageSwitcherProps) {\n\tconst { currentLanguage, availableLanguages, setLanguage } =\n\t\tuseTranslationStore();\n\n\tconst handleChange = (newLanguage: string) => {\n\t\tsetLanguage(newLanguage);\n\t\tonChange?.(newLanguage);\n\t};\n\n\tif (variant === \"buttons\") {\n\t\treturn (\n\t\t\t<div className={className} role=\"group\" aria-label=\"Language selection\">\n\t\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={lang}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handleChange(lang)}\n\t\t\t\t\t\taria-pressed={currentLanguage === lang}\n\t\t\t\t\t\tdata-active={currentLanguage === lang}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === \"minimal\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\t\t\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\t\t\t\thandleChange(availableLanguages[nextIndex]);\n\t\t\t\t}}\n\t\t\t\taria-label={`Current language: ${getLanguageInfo(currentLanguage).name}. Click to change.`}\n\t\t\t>\n\t\t\t\t{formatLanguageDisplay(currentLanguage, display)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<select\n\t\t\tvalue={currentLanguage}\n\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\tclassName={className}\n\t\t\taria-label=\"Select language\"\n\t\t>\n\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t<option key={lang} value={lang}>\n\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t</option>\n\t\t\t))}\n\t\t</select>\n\t);\n}\n","import { useCallback } from \"react\";\nimport { getTranslation, useTranslationStore } from \"../store\";\nimport type { CTFunction, InterpolationValues } from \"../types\";\n\nfunction isInterpolationValues(arg: unknown): arg is InterpolationValues {\n\treturn (\n\t\ttypeof arg === \"object\" &&\n\t\targ !== null &&\n\t\t!Array.isArray(arg) &&\n\t\t!(arg instanceof Date)\n\t);\n}\n\nexport function useCt(): CTFunction {\n\tconst { translations, currentLanguage } = useTranslationStore();\n\n\tconst ct = useCallback(\n\t\t(\n\t\t\ttext: string,\n\t\t\tcontextOrValues?: string | InterpolationValues,\n\t\t\tmaybeValues?: InterpolationValues,\n\t\t): string => {\n\t\t\tlet values: InterpolationValues | undefined;\n\n\t\t\tif (typeof contextOrValues === \"string\") {\n\t\t\t\tvalues = maybeValues;\n\t\t\t} else if (isInterpolationValues(contextOrValues)) {\n\t\t\t\tvalues = contextOrValues;\n\t\t\t}\n\n\t\t\treturn getTranslation(translations, currentLanguage, text, values);\n\t\t},\n\t\t[translations, currentLanguage],\n\t) as CTFunction;\n\n\treturn ct;\n}\n","import React, {\n\tcloneElement,\n\tisValidElement,\n\ttype ReactNode,\n\ttype ReactElement,\n} from \"react\";\nimport { useCt } from \"../hooks/useCt\";\nimport type { InterpolationValues } from \"../types\";\n\nfunction createTagRegex() {\n\treturn /<(\\d+)>(.*?)<\\/\\1>/gs;\n}\n\nexport interface TransProps {\n\tchildren: ReactNode;\n\tcontext?: string;\n\tvalues?: InterpolationValues;\n}\n\ninterface ParsedChild {\n\ttype: \"text\" | \"element\";\n\tcontent: string;\n\telement?: ReactElement;\n\tindex?: number;\n}\n\nfunction parseChildren(children: ReactNode): {\n\ttemplate: string;\n\telements: ReactElement[];\n} {\n\tconst elements: ReactElement[] = [];\n\tlet template = \"\";\n\n\tconst processNode = (node: ReactNode): string => {\n\t\tif (node === null || node === undefined) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (typeof node === \"string\") {\n\t\t\treturn node;\n\t\t}\n\n\t\tif (typeof node === \"number\") {\n\t\t\treturn String(node);\n\t\t}\n\n\t\tif (isValidElement(node)) {\n\t\t\tconst index = elements.length;\n\t\t\telements.push(node);\n\t\t\tconst innerContent = processNode(node.props.children);\n\t\t\treturn `<${index}>${innerContent}</${index}>`;\n\t\t}\n\n\t\tif (Array.isArray(node)) {\n\t\t\treturn node.map(processNode).join(\"\");\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\ttemplate = processNode(children);\n\treturn { template, elements };\n}\n\nfunction reconstructChildren(\n\ttranslated: string,\n\telements: ReactElement[],\n): ReactNode {\n\tif (elements.length === 0) {\n\t\treturn translated;\n\t}\n\n\tconst result: ReactNode[] = [];\n\tlet keyCounter = 0;\n\n\tlet lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\n\tconst tagRegex = createTagRegex();\n\n\twhile ((match = tagRegex.exec(translated)) !== null) {\n\t\t// Add text before the match\n\t\tif (match.index > lastIndex) {\n\t\t\tconst textBefore = translated.slice(lastIndex, match.index);\n\t\t\tif (textBefore) {\n\t\t\t\tresult.push(textBefore);\n\t\t\t}\n\t\t}\n\n\t\tconst elementIndex = parseInt(match[1], 10);\n\t\tconst innerContent = match[2];\n\t\tconst originalElement = elements[elementIndex];\n\n\t\tif (originalElement) {\n\t\t\t// Recursively process inner content in case of nested tags\n\t\t\tconst processedInner = reconstructChildren(innerContent, elements);\n\t\t\tconst cloned = cloneElement(originalElement, {\n\t\t\t\tkey: `trans-${keyCounter++}`,\n\t\t\t\tchildren: processedInner,\n\t\t\t});\n\t\t\tresult.push(cloned);\n\t\t}\n\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\n\t// Add remaining text after last match\n\tif (lastIndex < translated.length) {\n\t\tresult.push(translated.slice(lastIndex));\n\t}\n\n\t// If no matches found, return the original string\n\tif (result.length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn result.length === 1 ? result[0] : result;\n}\n\nexport function Trans({ children, context, values }: TransProps) {\n\tconst ct = useCt();\n\n\t// Parse children to extract template and elements\n\tconst { template, elements } = parseChildren(children);\n\n\t// Translate the template\n\tlet translated: string;\n\tif (context && values) {\n\t\ttranslated = ct(template, context, values);\n\t} else if (context) {\n\t\ttranslated = ct(template, context);\n\t} else if (values) {\n\t\ttranslated = ct(template, values);\n\t} else {\n\t\ttranslated = ct(template);\n\t}\n\n\t// Reconstruct with original elements\n\treturn <>{reconstructChildren(translated, elements)}</>;\n}\n","import { useCallback } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n} from \"../components/LanguageSwitcher\";\n\nexport function useCurrentLanguage(): string {\n\treturn useTranslationStore((state) => state.currentLanguage);\n}\n\nexport function useSetLanguage(): (language: string) => void {\n\treturn useTranslationStore((state) => state.setLanguage);\n}\n\nexport function useAvailableLanguages(): string[] {\n\treturn useTranslationStore((state) => state.availableLanguages);\n}\n\nexport function useIsLoading(): boolean {\n\treturn useTranslationStore((state) => state.isLoading);\n}\n\nexport function useIsReady(): boolean {\n\treturn useTranslationStore((state) => state.isReady);\n}\n\nexport function useLanguageInfo(code?: string): LanguageInfo {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst targetCode = code ?? currentLanguage;\n\treturn getFullLanguageInfo(targetCode);\n}\n\nexport function useAvailableLanguagesInfo(): LanguageInfo[] {\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\treturn availableLanguages.map(getFullLanguageInfo);\n}\n\nexport function useLanguage() {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst isLoading = useTranslationStore((state) => state.isLoading);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\n\tconst currentLanguageInfo = getFullLanguageInfo(currentLanguage);\n\tconst availableLanguagesInfo = availableLanguages.map(getFullLanguageInfo);\n\n\tconst cycleLanguage = useCallback(() => {\n\t\tif (availableLanguages.length === 0) {\n\t\t\tconsole.warn(\"[ciao-tools] Cannot cycle language: no languages available\");\n\t\t\treturn;\n\t\t}\n\t\tif (availableLanguages.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\tsetLanguage(availableLanguages[nextIndex]);\n\t}, [availableLanguages, currentLanguage, setLanguage]);\n\n\treturn {\n\t\tcurrentLanguage,\n\t\tcurrentLanguageInfo,\n\t\tavailableLanguages,\n\t\tavailableLanguagesInfo,\n\t\tsetLanguage,\n\t\tcycleLanguage,\n\t\tisLoading,\n\t\tisReady,\n\t};\n}\n\nexport function getCiaoLanguage(): string {\n\treturn useTranslationStore.getState().currentLanguage;\n}\n\nexport interface CiaoHeaders {\n\t\"X-Ciao-Language\": string;\n\t\"Accept-Language\": string;\n}\n\nexport function getCiaoHeaders(): CiaoHeaders {\n\tconst currentLanguage = useTranslationStore.getState().currentLanguage;\n\tconst defaultLanguage = useTranslationStore.getState().defaultLanguage;\n\n\tlet acceptLanguage = currentLanguage;\n\tif (defaultLanguage && defaultLanguage !== currentLanguage) {\n\t\tacceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;\n\t}\n\n\treturn {\n\t\t\"X-Ciao-Language\": currentLanguage,\n\t\t\"Accept-Language\": acceptLanguage,\n\t};\n}\n\nexport function ciaoFetch(\n\tinput: RequestInfo | URL,\n\tinit?: RequestInit,\n): Promise<Response> {\n\tconst headers = getCiaoHeaders();\n\tconst mergedHeaders = new Headers(init?.headers);\n\n\tif (!mergedHeaders.has(\"X-Ciao-Language\")) {\n\t\tmergedHeaders.set(\"X-Ciao-Language\", headers[\"X-Ciao-Language\"]);\n\t}\n\tif (!mergedHeaders.has(\"Accept-Language\")) {\n\t\tmergedHeaders.set(\"Accept-Language\", headers[\"Accept-Language\"]);\n\t}\n\n\treturn fetch(input, {\n\t\t...init,\n\t\theaders: mergedHeaders,\n\t});\n}\n\nexport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n};\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -59,6 +59,7 @@ interface CiaoProviderProps {
59
59
  preloadLanguages?: boolean;
60
60
  preloadDelay?: number;
61
61
  hotUpdates?: HotUpdateConfig;
62
+ autoInjectHeaders?: boolean;
62
63
  }
63
64
  /** @deprecated Use CiaoProviderProps instead */
64
65
  type CTProviderProps = CiaoProviderProps;
@@ -91,7 +92,8 @@ declare function CiaoProvider({
91
92
  fallback,
92
93
  preloadLanguages,
93
94
  preloadDelay,
94
- hotUpdates
95
+ hotUpdates,
96
+ autoInjectHeaders
95
97
  }: CiaoProviderProps): React$1.JSX.Element;
96
98
  //#endregion
97
99
  //#region src/components/LanguageSwitcher.d.ts
@@ -158,9 +160,17 @@ declare function useLanguage(): {
158
160
  isReady: boolean;
159
161
  };
160
162
  declare function getCiaoLanguage(): string;
161
- declare function getCiaoHeaders(): {
163
+ interface CiaoHeaders {
162
164
  "X-Ciao-Language": string;
163
- };
165
+ "Accept-Language": string;
166
+ }
167
+ declare function getCiaoHeaders(): CiaoHeaders;
168
+ declare function ciaoFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
169
+ //#endregion
170
+ //#region src/fetchInterceptor.d.ts
171
+ declare function patchGlobalFetch(): void;
172
+ declare function unpatchGlobalFetch(): void;
173
+ declare function isFetchPatched(): boolean;
164
174
  //#endregion
165
175
  //#region src/hooks/useHotUpdates.d.ts
166
176
  declare function useHotUpdates(config: HotUpdateConfig | undefined, projectId: string | undefined, sourceLanguage: string | undefined): {
@@ -198,5 +208,5 @@ declare function getCacheStats(): Promise<{
198
208
  languages: string[];
199
209
  }>;
200
210
  //#endregion
201
- export { CTContextBlock, CTContextBlockProps, CTFunction, CiaoProvider as CTProvider, CiaoProvider, CTProviderProps, CiaoManifest, CiaoProviderProps, HotUpdateConfig, InterpolationValues, LANGUAGE_DATA, type LanguageInfo, LanguageSwitcher, type LanguageSwitcherDisplay, type LanguageSwitcherProps, type LanguageSwitcherVariant, LanguageTranslations, StoredManifest, Trans, TranslationActions, TranslationMap, TranslationState, TranslationStore, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
211
+ export { CTContextBlock, CTContextBlockProps, CTFunction, CiaoProvider as CTProvider, CiaoProvider, CTProviderProps, type CiaoHeaders, CiaoManifest, CiaoProviderProps, HotUpdateConfig, InterpolationValues, LANGUAGE_DATA, type LanguageInfo, LanguageSwitcher, type LanguageSwitcherDisplay, type LanguageSwitcherProps, type LanguageSwitcherVariant, LanguageTranslations, StoredManifest, Trans, TranslationActions, TranslationMap, TranslationState, TranslationStore, ciaoFetch, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, isFetchPatched, patchGlobalFetch, unpatchGlobalFetch, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
202
212
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/components/CTContextBlock.tsx","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/components/Trans.tsx","../src/hooks/useCt.ts","../src/hooks/useLanguage.ts","../src/hooks/useHotUpdates.ts","../src/interpolate.ts","../src/store.ts","../src/cache.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/components/CTContextBlock.tsx","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/components/Trans.tsx","../src/hooks/useCt.ts","../src/hooks/useLanguage.ts","../src/fetchInterceptor.ts","../src/hooks/useHotUpdates.ts","../src/interpolate.ts","../src/store.ts","../src/cache.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -59,6 +59,7 @@ interface CiaoProviderProps {
59
59
  preloadLanguages?: boolean;
60
60
  preloadDelay?: number;
61
61
  hotUpdates?: HotUpdateConfig;
62
+ autoInjectHeaders?: boolean;
62
63
  }
63
64
  /** @deprecated Use CiaoProviderProps instead */
64
65
  type CTProviderProps = CiaoProviderProps;
@@ -91,7 +92,8 @@ declare function CiaoProvider({
91
92
  fallback,
92
93
  preloadLanguages,
93
94
  preloadDelay,
94
- hotUpdates
95
+ hotUpdates,
96
+ autoInjectHeaders
95
97
  }: CiaoProviderProps): React$1.JSX.Element;
96
98
  //#endregion
97
99
  //#region src/components/LanguageSwitcher.d.ts
@@ -158,9 +160,17 @@ declare function useLanguage(): {
158
160
  isReady: boolean;
159
161
  };
160
162
  declare function getCiaoLanguage(): string;
161
- declare function getCiaoHeaders(): {
163
+ interface CiaoHeaders {
162
164
  "X-Ciao-Language": string;
163
- };
165
+ "Accept-Language": string;
166
+ }
167
+ declare function getCiaoHeaders(): CiaoHeaders;
168
+ declare function ciaoFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
169
+ //#endregion
170
+ //#region src/fetchInterceptor.d.ts
171
+ declare function patchGlobalFetch(): void;
172
+ declare function unpatchGlobalFetch(): void;
173
+ declare function isFetchPatched(): boolean;
164
174
  //#endregion
165
175
  //#region src/hooks/useHotUpdates.d.ts
166
176
  declare function useHotUpdates(config: HotUpdateConfig | undefined, projectId: string | undefined, sourceLanguage: string | undefined): {
@@ -198,5 +208,5 @@ declare function getCacheStats(): Promise<{
198
208
  languages: string[];
199
209
  }>;
200
210
  //#endregion
201
- export { CTContextBlock, CTContextBlockProps, CTFunction, CiaoProvider as CTProvider, CiaoProvider, CTProviderProps, CiaoManifest, CiaoProviderProps, HotUpdateConfig, InterpolationValues, LANGUAGE_DATA, type LanguageInfo, LanguageSwitcher, type LanguageSwitcherDisplay, type LanguageSwitcherProps, type LanguageSwitcherVariant, LanguageTranslations, StoredManifest, Trans, TranslationActions, TranslationMap, TranslationState, TranslationStore, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
211
+ export { CTContextBlock, CTContextBlockProps, CTFunction, CiaoProvider as CTProvider, CiaoProvider, CTProviderProps, type CiaoHeaders, CiaoManifest, CiaoProviderProps, HotUpdateConfig, InterpolationValues, LANGUAGE_DATA, type LanguageInfo, LanguageSwitcher, type LanguageSwitcherDisplay, type LanguageSwitcherProps, type LanguageSwitcherVariant, LanguageTranslations, StoredManifest, Trans, TranslationActions, TranslationMap, TranslationState, TranslationStore, ciaoFetch, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, isFetchPatched, patchGlobalFetch, unpatchGlobalFetch, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
202
212
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/CTContextBlock.tsx","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/components/Trans.tsx","../src/hooks/useCt.ts","../src/hooks/useLanguage.ts","../src/hooks/useHotUpdates.ts","../src/interpolate.ts","../src/store.ts","../src/cache.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/CTContextBlock.tsx","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/components/Trans.tsx","../src/hooks/useCt.ts","../src/hooks/useLanguage.ts","../src/fetchInterceptor.ts","../src/hooks/useHotUpdates.ts","../src/interpolate.ts","../src/store.ts","../src/cache.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -667,10 +667,51 @@ function usePreloader({ effectiveManifest, currentLanguage, delay, enabled, load
667
667
  ]);
668
668
  }
669
669
 
670
+ //#endregion
671
+ //#region src/fetchInterceptor.ts
672
+ let originalFetch = null;
673
+ let isPatched = false;
674
+ function getHeaders() {
675
+ const currentLanguage = useTranslationStore.getState().currentLanguage;
676
+ const defaultLanguage = useTranslationStore.getState().defaultLanguage;
677
+ let acceptLanguage = currentLanguage;
678
+ if (defaultLanguage && defaultLanguage !== currentLanguage) acceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;
679
+ return {
680
+ "X-Ciao-Language": currentLanguage,
681
+ "Accept-Language": acceptLanguage
682
+ };
683
+ }
684
+ function patchGlobalFetch() {
685
+ if (typeof window === "undefined" || typeof fetch === "undefined") return;
686
+ if (isPatched) return;
687
+ originalFetch = window.fetch;
688
+ isPatched = true;
689
+ window.fetch = function(input, init) {
690
+ const headers = getHeaders();
691
+ const mergedHeaders = new Headers(init?.headers);
692
+ if (!mergedHeaders.has("X-Ciao-Language")) mergedHeaders.set("X-Ciao-Language", headers["X-Ciao-Language"]);
693
+ if (!mergedHeaders.has("Accept-Language")) mergedHeaders.set("Accept-Language", headers["Accept-Language"]);
694
+ return originalFetch(input, {
695
+ ...init,
696
+ headers: mergedHeaders
697
+ });
698
+ };
699
+ }
700
+ function unpatchGlobalFetch() {
701
+ if (typeof window === "undefined") return;
702
+ if (!isPatched || !originalFetch) return;
703
+ window.fetch = originalFetch;
704
+ originalFetch = null;
705
+ isPatched = false;
706
+ }
707
+ function isFetchPatched() {
708
+ return isPatched;
709
+ }
710
+
670
711
  //#endregion
671
712
  //#region src/components/CiaoProvider.tsx
672
713
  const PRELOAD_DELAY_MS = 5e3;
673
- function CiaoProvider({ children, translations, manifest, defaultLanguage = "en", availableLanguages, onLanguageChange, detectLanguage = true, blockUntilReady = true, fallback = null, preloadLanguages = true, preloadDelay = PRELOAD_DELAY_MS, hotUpdates = { enabled: true } }) {
714
+ function CiaoProvider({ children, translations, manifest, defaultLanguage = "en", availableLanguages, onLanguageChange, detectLanguage = true, blockUntilReady = true, fallback = null, preloadLanguages = true, preloadDelay = PRELOAD_DELAY_MS, hotUpdates = { enabled: true }, autoInjectHeaders = true }) {
674
715
  const loadTranslations = useTranslationStore((state) => state.loadTranslations);
675
716
  const setReady = useTranslationStore((state) => state.setReady);
676
717
  const currentLanguage = useTranslationStore((state) => state.currentLanguage);
@@ -744,6 +785,12 @@ function CiaoProvider({ children, translations, manifest, defaultLanguage = "en"
744
785
  abortControllerRef.current?.abort();
745
786
  };
746
787
  }, [abortControllerRef]);
788
+ useEffect(() => {
789
+ if (autoInjectHeaders) patchGlobalFetch();
790
+ return () => {
791
+ if (autoInjectHeaders) unpatchGlobalFetch();
792
+ };
793
+ }, [autoInjectHeaders]);
747
794
  if (blockUntilReady && (!isReady || !isHydrated)) return /* @__PURE__ */ React.createElement(React.Fragment, null, fallback);
748
795
  return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
749
796
  }
@@ -1155,9 +1202,26 @@ function getCiaoLanguage() {
1155
1202
  return useTranslationStore.getState().currentLanguage;
1156
1203
  }
1157
1204
  function getCiaoHeaders() {
1158
- return { "X-Ciao-Language": useTranslationStore.getState().currentLanguage };
1205
+ const currentLanguage = useTranslationStore.getState().currentLanguage;
1206
+ const defaultLanguage = useTranslationStore.getState().defaultLanguage;
1207
+ let acceptLanguage = currentLanguage;
1208
+ if (defaultLanguage && defaultLanguage !== currentLanguage) acceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;
1209
+ return {
1210
+ "X-Ciao-Language": currentLanguage,
1211
+ "Accept-Language": acceptLanguage
1212
+ };
1213
+ }
1214
+ function ciaoFetch(input, init) {
1215
+ const headers = getCiaoHeaders();
1216
+ const mergedHeaders = new Headers(init?.headers);
1217
+ if (!mergedHeaders.has("X-Ciao-Language")) mergedHeaders.set("X-Ciao-Language", headers["X-Ciao-Language"]);
1218
+ if (!mergedHeaders.has("Accept-Language")) mergedHeaders.set("Accept-Language", headers["Accept-Language"]);
1219
+ return fetch(input, {
1220
+ ...init,
1221
+ headers: mergedHeaders
1222
+ });
1159
1223
  }
1160
1224
 
1161
1225
  //#endregion
1162
- export { CTContextBlock, CiaoProvider as CTProvider, CiaoProvider, LANGUAGE_DATA, LanguageSwitcher, Trans, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
1226
+ export { CTContextBlock, CiaoProvider as CTProvider, CiaoProvider, LANGUAGE_DATA, LanguageSwitcher, Trans, ciaoFetch, clearCache, clearFormatterCache, formatLanguageDisplay, getCacheStats, getCiaoHeaders, getCiaoLanguage, getFullLanguageInfo, getLanguageInfo, interpolate, isFetchPatched, patchGlobalFetch, unpatchGlobalFetch, useAvailableLanguages, useAvailableLanguagesInfo, useCt, useCurrentLanguage, useHotUpdates, useIsLoading, useIsReady, useLanguage, useLanguageInfo, useSetLanguage, useTranslationStore };
1163
1227
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["options: Intl.DateTimeFormatOptions","result: string","key: string","format: string | undefined","hydrationResolver: (() => void) | null","dbPromise: Promise<IDBDatabase> | null","entry: CacheEntry","updatedLanguages: string[]","LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n>","values: InterpolationValues | undefined","elements: ReactElement[]","result: ReactNode[]","match: RegExpExecArray | null","translated: string"],"sources":["../src/components/CTContextBlock.tsx","../src/interpolate.ts","../src/store.ts","../src/cache.ts","../src/hooks/useHotUpdates.ts","../src/hooks/useManifest.ts","../src/hooks/useTranslationLoader.ts","../src/utils/browserLanguage.ts","../src/hooks/useLanguageInit.ts","../src/hooks/usePreloader.ts","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/hooks/useCt.ts","../src/components/Trans.tsx","../src/hooks/useLanguage.ts"],"sourcesContent":["import React from \"react\";\nimport type { CTContextBlockProps } from \"../types\";\n\nexport function CTContextBlock({ children }: CTContextBlockProps) {\n\treturn <>{children}</>;\n}\n","export type InterpolationValues = Record<string, unknown>;\n\nconst MAX_CACHE_SIZE = 100;\n\ninterface BoundedCache<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n\thas(key: K): boolean;\n\tclear(): void;\n}\n\nfunction createBoundedCache<K, V>(maxSize: number): BoundedCache<K, V> {\n\tconst cache = new Map<K, V>();\n\treturn {\n\t\tget(key: K): V | undefined {\n\t\t\treturn cache.get(key);\n\t\t},\n\t\tset(key: K, value: V): void {\n\t\t\tif (cache.size >= maxSize) {\n\t\t\t\tconst firstKey = cache.keys().next().value;\n\t\t\t\tif (firstKey !== undefined) {\n\t\t\t\t\tcache.delete(firstKey);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcache.set(key, value);\n\t\t},\n\t\thas(key: K): boolean {\n\t\t\treturn cache.has(key);\n\t\t},\n\t\tclear(): void {\n\t\t\tcache.clear();\n\t\t},\n\t};\n}\n\nconst numberFormatCache = createBoundedCache<string, Intl.NumberFormat>(MAX_CACHE_SIZE);\nconst dateFormatCache = createBoundedCache<string, Intl.DateTimeFormat>(MAX_CACHE_SIZE);\nconst pluralRulesCache = createBoundedCache<string, Intl.PluralRules>(MAX_CACHE_SIZE);\n\nexport function clearFormatterCache(): void {\n\tnumberFormatCache.clear();\n\tdateFormatCache.clear();\n\tpluralRulesCache.clear();\n}\n\nfunction getNumberFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `number:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tmaximumFractionDigits: 20,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getCurrencyFormatter(\n\tlocale: string,\n\tcurrency: string,\n): Intl.NumberFormat {\n\tconst key = `currency:${locale}:${currency}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getPercentFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `percent:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"percent\",\n\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getDateFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `date:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\tdateStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getTimeFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `time:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\ttimeStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getPluralRules(locale: string): Intl.PluralRules {\n\tif (!pluralRulesCache.has(locale)) {\n\t\tpluralRulesCache.set(locale, new Intl.PluralRules(locale));\n\t}\n\treturn pluralRulesCache.get(locale)!;\n}\n\nexport function formatValue(\n\tvalue: unknown,\n\tformat: string | undefined,\n\tlocale: string,\n): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\n\tif (!format) {\n\t\treturn String(value);\n\t}\n\n\tconst parts = format.split(\":\");\n\tconst formatType = parts[0];\n\n\tswitch (formatType) {\n\t\tcase \"number\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getNumberFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"currency\": {\n\t\t\tconst currency = parts[1];\n\t\t\tif (!currency) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getCurrencyFormatter(locale, currency).format(num);\n\t\t}\n\n\t\tcase \"percent\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getPercentFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"date\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getDateFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"time\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getTimeFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"plural\": {\n\t\t\tconst singular = parts[1];\n\t\t\tconst plural = parts[2];\n\t\t\tif (!singular || !plural) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tconst rules = getPluralRules(locale);\n\t\t\tconst category = rules.select(num);\n\t\t\treturn category === \"one\" ? singular : plural;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\nexport function interpolate(\n\ttext: string,\n\tvalues: InterpolationValues | undefined,\n\tlocale: string,\n): string {\n\tconst escaped = text.replace(/\\{\\{/g, \"\\x00\").replace(/\\}\\}/g, \"\\x01\");\n\n\tlet result: string;\n\tif (!values || Object.keys(values).length === 0) {\n\t\tresult = escaped;\n\t} else {\n\t\tresult = escaped.replace(/\\{([^}]+)\\}/g, (match, placeholder) => {\n\t\t\tconst trimmed = placeholder.trim();\n\t\t\tconst colonIndex = trimmed.indexOf(\":\");\n\n\t\t\tlet key: string;\n\t\t\tlet format: string | undefined;\n\n\t\t\tif (colonIndex === -1) {\n\t\t\t\tkey = trimmed;\n\t\t\t\tformat = undefined;\n\t\t\t} else {\n\t\t\t\tkey = trimmed.substring(0, colonIndex);\n\t\t\t\tformat = trimmed.substring(colonIndex + 1);\n\t\t\t}\n\n\t\t\tif (!(key in values)) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tconst value = values[key];\n\t\t\treturn formatValue(value, format, locale);\n\t\t});\n\t}\n\n\treturn result.replace(/\\x00/g, \"{\").replace(/\\x01/g, \"}\");\n}\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { interpolate } from \"./interpolate\";\nimport type {\n\tInterpolationValues,\n\tLanguageTranslations,\n\tStoredManifest,\n\tTranslationMap,\n\tTranslationStore,\n} from \"./types\";\n\nlet hydrationResolver: (() => void) | null = null;\nconst hydrationPromise = new Promise<void>((resolve) => {\n\thydrationResolver = resolve;\n});\n\nexport const useTranslationStore = create<TranslationStore>()(\n\tpersist(\n\t\t(set) => ({\n\t\t\tcurrentLanguage: \"en\",\n\t\t\tdefaultLanguage: \"en\",\n\t\t\tavailableLanguages: [\"en\"],\n\t\t\ttranslations: {},\n\t\t\tisLoading: false,\n\t\t\tisReady: false,\n\t\t\tisHydrated: false,\n\t\t\tstoredManifest: null,\n\t\t\tlastVersionCheck: null,\n\n\t\t\tsetLanguage: (language: string) => {\n\t\t\t\tset({ currentLanguage: language, isReady: false });\n\t\t\t},\n\n\t\t\tloadTranslations: (translations: LanguageTranslations) => {\n\t\t\t\tset((state) => {\n\t\t\t\t\tconst languages = Object.keys(translations);\n\t\t\t\t\tconst availableLanguages = [\n\t\t\t\t\t\t...new Set([...state.availableLanguages, ...languages]),\n\t\t\t\t\t];\n\t\t\t\t\tconst merged = { ...state.translations };\n\t\t\t\t\tfor (const lang of languages) {\n\t\t\t\t\t\tmerged[lang] = { ...merged[lang], ...translations[lang] };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttranslations: merged,\n\t\t\t\t\t\tavailableLanguages,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\n\t\t\taddLanguage: (language: string, translations: TranslationMap) => {\n\t\t\t\tset((state) => ({\n\t\t\t\t\ttranslations: {\n\t\t\t\t\t\t...state.translations,\n\t\t\t\t\t\t[language]: { ...state.translations[language], ...translations },\n\t\t\t\t\t},\n\t\t\t\t\tavailableLanguages: state.availableLanguages.includes(language)\n\t\t\t\t\t\t? state.availableLanguages\n\t\t\t\t\t\t: [...state.availableLanguages, language],\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tsetLoading: (loading: boolean) => {\n\t\t\t\tset({ isLoading: loading });\n\t\t\t},\n\n\t\t\tsetReady: (ready: boolean) => {\n\t\t\t\tset({ isReady: ready });\n\t\t\t},\n\n\t\t\tsetStoredManifest: (manifest: StoredManifest) => {\n\t\t\t\tset({ storedManifest: manifest, lastVersionCheck: Date.now() });\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: \"ciao-tools-language\",\n\t\t\tpartialize: (state) => ({\n\t\t\t\tcurrentLanguage: state.currentLanguage,\n\t\t\t\tstoredManifest: state.storedManifest,\n\t\t\t}),\n\t\t\tonRehydrateStorage: () => (_, error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconsole.error(\"[ciao-tools] Storage hydration failed:\", error);\n\t\t\t\t}\n\t\t\t\tif (hydrationResolver) {\n\t\t\t\t\thydrationResolver();\n\t\t\t\t\thydrationResolver = null;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t),\n);\n\nhydrationPromise.then(() => {\n\tuseTranslationStore.setState({ isHydrated: true });\n});\n\nexport function getTranslation(\n\ttranslations: LanguageTranslations,\n\tlanguage: string,\n\ttext: string,\n\tvalues?: InterpolationValues,\n): string {\n\tconst translated = translations[language]?.[text] ?? text;\n\n\tif (!values || Object.keys(values).length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn interpolate(translated, values, language);\n}\n","import type { TranslationMap } from \"./types\";\n\nconst DB_NAME = \"ciao-tools-translations\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"translations\";\n\ninterface CacheEntry {\n\tlanguage: string;\n\tprojectId: string;\n\tdata: TranslationMap;\n\turl: string;\n\tcachedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDB(): Promise<IDBDatabase> {\n\tif (dbPromise) return dbPromise;\n\n\tdbPromise = new Promise((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\tdbPromise = null;\n\t\t\treject(new Error(\"IndexedDB not available\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst request = indexedDB.open(DB_NAME, DB_VERSION);\n\n\t\trequest.onerror = () => {\n\t\t\tdbPromise = null;\n\t\t\treject(request.error);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\t\t\tif (!db.objectStoreNames.contains(STORE_NAME)) {\n\t\t\t\tconst store = db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n\t\t\t\tstore.createIndex(\"language\", \"language\", { unique: false });\n\t\t\t\tstore.createIndex(\"projectId\", \"projectId\", { unique: false });\n\t\t\t}\n\t\t};\n\t});\n\n\treturn dbPromise;\n}\n\nexport async function getCachedTranslation(\n\turl: string,\n): Promise<TranslationMap | null> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\t\t\tconst request = store.get(url);\n\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst entry = request.result as CacheEntry | undefined;\n\t\t\t\tresolve(entry?.data ?? null);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to read from cache:\", error);\n\t\treturn null;\n\t}\n}\n\nexport async function cacheTranslation(\n\turl: string,\n\tlanguage: string,\n\tprojectId: string,\n\tdata: TranslationMap,\n): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst entry: CacheEntry = {\n\t\t\t\turl,\n\t\t\t\tlanguage,\n\t\t\t\tprojectId,\n\t\t\t\tdata,\n\t\t\t\tcachedAt: Date.now(),\n\t\t\t};\n\n\t\t\tconst request = store.put(entry);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => resolve();\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to write to cache:\", error);\n\t}\n}\n\nexport async function clearCache(projectId?: string): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tif (projectId) {\n\t\t\t\tconst index = store.index(\"projectId\");\n\t\t\t\tconst request = index.openCursor(IDBKeyRange.only(projectId));\n\t\t\t\trequest.onsuccess = (event) => {\n\t\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\tcursor.delete();\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => resolve();\n\t\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t\t} else {\n\t\t\t\tconst request = store.clear();\n\t\t\t\trequest.onerror = () => reject(request.error);\n\t\t\t\trequest.onsuccess = () => resolve();\n\t\t\t}\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to clear cache:\", error);\n\t}\n}\n\nexport async function getCacheStats(): Promise<{\n\tcount: number;\n\tlanguages: string[];\n}> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst countRequest = store.count();\n\t\t\tconst languages = new Set<string>();\n\n\t\t\tconst cursorRequest = store.openCursor();\n\t\t\tcursorRequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tlanguages.add((cursor.value as CacheEntry).language);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttransaction.oncomplete = () => {\n\t\t\t\tresolve({\n\t\t\t\t\tcount: countRequest.result,\n\t\t\t\t\tlanguages: Array.from(languages),\n\t\t\t\t});\n\t\t\t};\n\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to get cache stats:\", error);\n\t\treturn { count: 0, languages: [] };\n\t}\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { clearCache, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { HotUpdateConfig, StoredManifest, TranslationMap } from \"../types\";\n\nconst CDN_BASE_URL = \"https://t1.ciao-tools.com\";\n\ninterface LatestManifest {\n\tversion: number;\n\tupdatedAt: string;\n\turls: Record<string, string>;\n}\n\nasync function fetchLatestManifest(projectId: string): Promise<LatestManifest | null> {\n\tconst url = `${CDN_BASE_URL}/translations/${projectId}/latest.json`;\n\ttry {\n\t\tconst response = await fetch(url, { cache: \"no-cache\" });\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to fetch latest manifest: ${response.statusText}`);\n\t\t}\n\t\treturn response.json();\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to fetch latest manifest:\", error);\n\t\treturn null;\n\t}\n}\n\nasync function fetchTranslations(url: string): Promise<TranslationMap> {\n\tconst response = await fetch(url);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useHotUpdates(\n\tconfig: HotUpdateConfig | undefined,\n\tprojectId: string | undefined,\n\tsourceLanguage: string | undefined,\n) {\n\tconst isCheckingRef = useRef(false);\n\tconst hasCheckedOnMountRef = useRef(false);\n\n\tconst configRef = useRef(config);\n\tconst projectIdRef = useRef(projectId);\n\tconst sourceLanguageRef = useRef(sourceLanguage);\n\n\tuseEffect(() => {\n\t\tconfigRef.current = config;\n\t\tprojectIdRef.current = projectId;\n\t\tsourceLanguageRef.current = sourceLanguage;\n\t}, [config, projectId, sourceLanguage]);\n\n\tconst { setStoredManifest, addLanguage } = useTranslationStore();\n\n\tconst checkForUpdates = useCallback(async () => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\t\tconst currentSourceLanguage = sourceLanguageRef.current;\n\n\t\tif (!currentConfig || !currentProjectId || isCheckingRef.current) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tisCheckingRef.current = true;\n\n\t\ttry {\n\t\t\tconsole.log(\"[ciao-tools] Checking for hot updates...\");\n\t\t\tconst latestManifest = await fetchLatestManifest(currentProjectId);\n\n\t\t\tif (!latestManifest) {\n\t\t\t\tconsole.log(\"[ciao-tools] No latest.json found (project may not have hot updates yet)\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\"[ciao-tools] Found latest.json, version:\", latestManifest.version);\n\n\t\t\tconst currentManifest = useTranslationStore.getState().storedManifest;\n\t\t\tconst currentVersion = currentManifest?.serverVersion ?? null;\n\t\t\tconst isFirstCheck = currentVersion === null;\n\t\t\tconst hasNewVersion = currentVersion !== null && latestManifest.version > currentVersion;\n\n\t\t\tif (isFirstCheck || hasNewVersion) {\n\t\t\t\tif (Object.keys(latestManifest.urls).length > 0) {\n\t\t\t\t\tconst reason = hasNewVersion ? \"new version\" : \"first check\";\n\t\t\t\t\tconsole.log(`[ciao-tools] Fetching translations (${reason})...`);\n\n\t\t\t\t\tif (hasNewVersion) {\n\t\t\t\t\t\tawait clearCache(currentProjectId);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst updatedLanguages: string[] = [];\n\n\t\t\t\t\tfor (const [langCode, url] of Object.entries(latestManifest.urls)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst translations = await fetchTranslations(url);\n\t\t\t\t\t\t\taddLanguage(langCode, translations);\n\t\t\t\t\t\t\tawait cacheTranslation(url, langCode, currentProjectId, translations);\n\t\t\t\t\t\t\tupdatedLanguages.push(langCode);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(`[ciao-tools] Failed to fetch ${langCode} translations:`, err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedLanguages.length > 0) {\n\t\t\t\t\t\tconsole.log(\"[ciao-tools] Updated translations for:\", updatedLanguages);\n\t\t\t\t\t\tif (hasNewVersion && currentConfig.onTranslationsUpdated) {\n\t\t\t\t\t\t\tcurrentConfig.onTranslationsUpdated(updatedLanguages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newStoredManifest: StoredManifest = {\n\t\t\t\t\tserverVersion: latestManifest.version,\n\t\t\t\t\tupdatedAt: latestManifest.updatedAt,\n\t\t\t\t\tprojectId: currentProjectId,\n\t\t\t\t\tsourceLanguage: currentManifest?.sourceLanguage ?? currentSourceLanguage ?? \"en\",\n\t\t\t\t\tlanguages: Object.keys(latestManifest.urls),\n\t\t\t\t\tcdnUrls: latestManifest.urls,\n\t\t\t\t};\n\n\t\t\t\tsetStoredManifest(newStoredManifest);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"[ciao-tools] Already up to date (version \" + latestManifest.version + \")\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[ciao-tools] Hot update check failed:\", error);\n\t\t} finally {\n\t\t\tisCheckingRef.current = false;\n\t\t}\n\t}, [setStoredManifest, addLanguage]);\n\n\tuseEffect(() => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\n\t\tif (!currentConfig || !currentProjectId) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tif (!hasCheckedOnMountRef.current) {\n\t\t\thasCheckedOnMountRef.current = true;\n\t\t\tcheckForUpdates();\n\t\t}\n\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (document.visibilityState === \"visible\") {\n\t\t\t\tcheckForUpdates();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\t};\n\t}, [checkForUpdates]);\n\n\treturn { checkForUpdates };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, StoredManifest } from \"../types\";\n\nexport interface UseManifestOptions {\n\tmanifest?: CiaoManifest;\n}\n\nexport interface UseManifestResult {\n\teffectiveManifest: CiaoManifest | undefined;\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\thasManifestChanged: boolean;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n}\n\nfunction getManifestUrlsHash(manifest: CiaoManifest | undefined): string {\n\tif (!manifest) return \"\";\n\treturn JSON.stringify(manifest.cdnUrls);\n}\n\nexport function useManifest({ manifest }: UseManifestOptions): UseManifestResult {\n\tconst storedManifest = useTranslationStore((state) => state.storedManifest);\n\n\tconst effectiveManifest = useMemo((): CiaoManifest | undefined => {\n\t\tif (storedManifest && storedManifest.projectId === manifest?.projectId) {\n\t\t\treturn {\n\t\t\t\tversion: String(storedManifest.serverVersion),\n\t\t\t\tprojectId: storedManifest.projectId,\n\t\t\t\tsourceLanguage: storedManifest.sourceLanguage,\n\t\t\t\tlanguages: storedManifest.languages,\n\t\t\t\tcdnUrls: storedManifest.cdnUrls,\n\t\t\t\tgeneratedAt: storedManifest.updatedAt,\n\t\t\t};\n\t\t}\n\t\treturn manifest;\n\t}, [storedManifest, manifest]);\n\n\tconst manifestRef = useRef<CiaoManifest | undefined>(effectiveManifest);\n\tconst previousManifestHashRef = useRef<string>(\"\");\n\tconst loadedUrlsRef = useRef<Map<string, string>>(new Map());\n\tconst hasManifestChangedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tmanifestRef.current = effectiveManifest;\n\n\t\tconst newHash = getManifestUrlsHash(effectiveManifest);\n\t\tconst oldHash = previousManifestHashRef.current;\n\n\t\tif (oldHash && newHash && oldHash !== newHash) {\n\t\t\tloadedUrlsRef.current.clear();\n\t\t\tuseTranslationStore.setState({ translations: {} });\n\t\t\thasManifestChangedRef.current = true;\n\t\t} else {\n\t\t\thasManifestChangedRef.current = false;\n\t\t}\n\n\t\tpreviousManifestHashRef.current = newHash;\n\t}, [effectiveManifest]);\n\n\treturn {\n\t\teffectiveManifest,\n\t\tmanifestRef,\n\t\thasManifestChanged: hasManifestChangedRef.current,\n\t\tloadedUrlsRef,\n\t};\n}\n","import { useCallback, useRef } from \"react\";\nimport { getCachedTranslation, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, TranslationMap } from \"../types\";\n\nexport interface UseTranslationLoaderOptions {\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n\thotUpdatesEnabled?: boolean;\n}\n\nexport interface UseTranslationLoaderResult {\n\tloadLanguage: (language: string, isPreload?: boolean) => Promise<boolean>;\n\tabortControllerRef: React.RefObject<AbortController | null>;\n}\n\nasync function fetchTranslationsFromCDN(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<TranslationMap> {\n\tconst response = await fetch(url, { signal });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useTranslationLoader({\n\tmanifestRef,\n\tloadedUrlsRef,\n\thotUpdatesEnabled,\n}: UseTranslationLoaderOptions): UseTranslationLoaderResult {\n\tconst addLanguage = useTranslationStore((state) => state.addLanguage);\n\tconst setLoading = useTranslationStore((state) => state.setLoading);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst loadLanguage = useCallback(\n\t\tasync (language: string, isPreload = false): Promise<boolean> => {\n\t\t\tconst currentManifest = manifestRef.current;\n\t\t\tif (!currentManifest) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst cdnUrl = currentManifest.cdnUrls[language];\n\n\t\t\tif (!cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst loadedUrl = loadedUrlsRef.current.get(language);\n\t\t\tif (loadedUrl === cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!isPreload) {\n\t\t\t\tif (abortControllerRef.current) {\n\t\t\t\t\tabortControllerRef.current.abort();\n\t\t\t\t}\n\t\t\t\tabortControllerRef.current = new AbortController();\n\t\t\t}\n\n\t\t\tconst controller = isPreload ? undefined : abortControllerRef.current;\n\n\t\t\tif (!isPreload) {\n\t\t\t\tsetLoading(true);\n\t\t\t\tsetReady(false);\n\t\t\t}\n\n\t\t\tconst useCache = hotUpdatesEnabled !== true;\n\n\t\t\ttry {\n\t\t\t\tif (useCache) {\n\t\t\t\t\tconst cached = await getCachedTranslation(cdnUrl);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\tif (controller?.signal.aborted) return false;\n\t\t\t\t\t\taddLanguage(language, cached);\n\t\t\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\t\t\t\t\t\tif (!isPreload) {\n\t\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst translationData = await fetchTranslationsFromCDN(\n\t\t\t\t\tcdnUrl,\n\t\t\t\t\tcontroller?.signal,\n\t\t\t\t);\n\n\t\t\t\tif (controller?.signal.aborted) return false;\n\n\t\t\t\taddLanguage(language, translationData);\n\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\n\t\t\t\tif (useCache) {\n\t\t\t\t\tawait cacheTranslation(\n\t\t\t\t\t\tcdnUrl,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tcurrentManifest.projectId,\n\t\t\t\t\t\ttranslationData,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[ciao-tools] Failed to load translations for ${language}:`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tif (!isPreload) setLoading(false);\n\t\t\t}\n\t\t},\n\t\t[manifestRef, loadedUrlsRef, hotUpdatesEnabled, addLanguage, setLoading, setReady],\n\t);\n\n\treturn { loadLanguage, abortControllerRef };\n}\n","export function detectBrowserLanguage(availableLanguages: string[]): string | null {\n\tif (typeof navigator === \"undefined\") return null;\n\n\tconst browserLangs = navigator.languages || [navigator.language];\n\n\tfor (const browserLang of browserLangs) {\n\t\tconst normalized = browserLang.toLowerCase();\n\t\tif (availableLanguages.includes(normalized)) {\n\t\t\treturn normalized;\n\t\t}\n\t\tconst langCode = normalized.split(\"-\")[0];\n\t\tif (availableLanguages.includes(langCode)) {\n\t\t\treturn langCode;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { detectBrowserLanguage } from \"../utils/browserLanguage\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UseLanguageInitOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tavailableLanguages?: string[];\n\tdefaultLanguage: string;\n\tdetectLanguage: boolean;\n}\n\nexport function useLanguageInit({\n\teffectiveManifest,\n\tavailableLanguages,\n\tdefaultLanguage,\n\tdetectLanguage,\n}: UseLanguageInitOptions): void {\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst initializedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\t\tif (initializedRef.current) return;\n\t\tinitializedRef.current = true;\n\n\t\tconst store = useTranslationStore.getState();\n\t\tconst effectiveLanguages = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages || [];\n\n\t\tconst hasPersistedLanguage =\n\t\t\tstore.currentLanguage &&\n\t\t\tstore.currentLanguage !== \"en\" &&\n\t\t\teffectiveLanguages.includes(store.currentLanguage);\n\n\t\tif (hasPersistedLanguage) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (detectLanguage && effectiveLanguages.length > 0) {\n\t\t\tconst detected = detectBrowserLanguage(effectiveLanguages);\n\t\t\tif (detected) {\n\t\t\t\tsetLanguage(detected);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (defaultLanguage && defaultLanguage !== store.currentLanguage) {\n\t\t\tsetLanguage(defaultLanguage);\n\t\t}\n\t}, [\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t\tsetLanguage,\n\t\tisHydrated,\n\t]);\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UsePreloaderOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tcurrentLanguage: string;\n\tdelay: number;\n\tenabled: boolean;\n\tloadLanguage: (language: string, isPreload: boolean) => Promise<boolean>;\n}\n\nexport function usePreloader({\n\teffectiveManifest,\n\tcurrentLanguage,\n\tdelay,\n\tenabled,\n\tloadLanguage,\n}: UsePreloaderOptions): void {\n\tconst preloadTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst isMountedRef = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMountedRef.current = true;\n\t\treturn () => {\n\t\t\tisMountedRef.current = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!enabled || !effectiveManifest) return;\n\n\t\tif (preloadTimeoutRef.current) {\n\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t}\n\n\t\tpreloadTimeoutRef.current = setTimeout(async () => {\n\t\t\tif (!isMountedRef.current) return;\n\n\t\t\tconst languages = [...effectiveManifest.languages];\n\t\t\tfor (const language of languages) {\n\t\t\t\tif (!isMountedRef.current) break;\n\t\t\t\tif (language === effectiveManifest.sourceLanguage) continue;\n\t\t\t\tif (language === currentLanguage) continue;\n\n\t\t\t\tawait loadLanguage(language, true);\n\t\t\t}\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tif (preloadTimeoutRef.current) {\n\t\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, [effectiveManifest, currentLanguage, enabled, delay, loadLanguage]);\n}\n","import React, { useEffect } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { useHotUpdates } from \"../hooks/useHotUpdates\";\nimport { useManifest } from \"../hooks/useManifest\";\nimport { useTranslationLoader } from \"../hooks/useTranslationLoader\";\nimport { useLanguageInit } from \"../hooks/useLanguageInit\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport type { CiaoProviderProps } from \"../types\";\n\nconst PRELOAD_DELAY_MS = 5000;\n\nexport function CiaoProvider({\n\tchildren,\n\ttranslations,\n\tmanifest,\n\tdefaultLanguage = \"en\",\n\tavailableLanguages,\n\tonLanguageChange,\n\tdetectLanguage = true,\n\tblockUntilReady = true,\n\tfallback = null,\n\tpreloadLanguages = true,\n\tpreloadDelay = PRELOAD_DELAY_MS,\n\thotUpdates = { enabled: true },\n}: CiaoProviderProps) {\n\tconst loadTranslations = useTranslationStore((state) => state.loadTranslations);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\n\tconst { effectiveManifest, manifestRef, loadedUrlsRef } = useManifest({ manifest });\n\n\tconst { loadLanguage, abortControllerRef } = useTranslationLoader({\n\t\tmanifestRef,\n\t\tloadedUrlsRef,\n\t\thotUpdatesEnabled: hotUpdates?.enabled,\n\t});\n\n\tuseLanguageInit({\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t});\n\n\tusePreloader({\n\t\teffectiveManifest,\n\t\tcurrentLanguage,\n\t\tdelay: preloadDelay,\n\t\tenabled: preloadLanguages,\n\t\tloadLanguage,\n\t});\n\n\tuseHotUpdates(hotUpdates, manifest?.projectId, manifest?.sourceLanguage);\n\n\tuseEffect(() => {\n\t\tif (translations) {\n\t\t\tloadTranslations(translations);\n\t\t\tsetReady(true);\n\t\t}\n\t}, [translations, loadTranslations, setReady]);\n\n\tuseEffect(() => {\n\t\tconst languagesList = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages;\n\n\t\tif (languagesList) {\n\t\t\tconst store = useTranslationStore.getState();\n\t\t\tconst merged = [\n\t\t\t\t...new Set([...store.availableLanguages, ...languagesList]),\n\t\t\t];\n\t\t\tuseTranslationStore.setState({\n\t\t\t\tavailableLanguages: merged,\n\t\t\t\tdefaultLanguage,\n\t\t\t});\n\t\t}\n\t}, [availableLanguages, effectiveManifest, defaultLanguage]);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentLanguage === effectiveManifest?.sourceLanguage) {\n\t\t\tsetReady(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (effectiveManifest && currentLanguage) {\n\t\t\tloadLanguage(currentLanguage, false);\n\t\t} else if (!effectiveManifest) {\n\t\t\tsetReady(true);\n\t\t}\n\t}, [effectiveManifest, currentLanguage, loadLanguage, setReady, isHydrated]);\n\n\tuseEffect(() => {\n\t\tif (onLanguageChange) {\n\t\t\tonLanguageChange(currentLanguage);\n\t\t}\n\t}, [currentLanguage, onLanguageChange]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t};\n\t}, [abortControllerRef]);\n\n\tif (blockUntilReady && (!isReady || !isHydrated)) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn <>{children}</>;\n}\n","import React, { createContext, useContext, useCallback, type ReactNode } from \"react\";\nimport { useTranslationStore } from \"../store\";\n\nexport const LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n> = {\n\ten: { name: \"English\", nativeName: \"English\", flag: \"🇺🇸\" },\n\tes: { name: \"Spanish\", nativeName: \"Español\", flag: \"🇪🇸\" },\n\tfr: { name: \"French\", nativeName: \"Français\", flag: \"🇫🇷\" },\n\tde: { name: \"German\", nativeName: \"Deutsch\", flag: \"🇩🇪\" },\n\tit: { name: \"Italian\", nativeName: \"Italiano\", flag: \"🇮🇹\" },\n\tpt: { name: \"Portuguese\", nativeName: \"Português\", flag: \"🇵🇹\" },\n\tja: { name: \"Japanese\", nativeName: \"日本語\", flag: \"🇯🇵\" },\n\tko: { name: \"Korean\", nativeName: \"한국어\", flag: \"🇰🇷\" },\n\tzh: { name: \"Chinese\", nativeName: \"中文\", flag: \"🇨🇳\" },\n\tar: { name: \"Arabic\", nativeName: \"العربية\", flag: \"🇸🇦\" },\n\tru: { name: \"Russian\", nativeName: \"Русский\", flag: \"🇷🇺\" },\n\tnl: { name: \"Dutch\", nativeName: \"Nederlands\", flag: \"🇳🇱\" },\n\tpl: { name: \"Polish\", nativeName: \"Polski\", flag: \"🇵🇱\" },\n\tsv: { name: \"Swedish\", nativeName: \"Svenska\", flag: \"🇸🇪\" },\n\tda: { name: \"Danish\", nativeName: \"Dansk\", flag: \"🇩🇰\" },\n\tfi: { name: \"Finnish\", nativeName: \"Suomi\", flag: \"🇫🇮\" },\n\tno: { name: \"Norwegian\", nativeName: \"Norsk\", flag: \"🇳🇴\" },\n\ttr: { name: \"Turkish\", nativeName: \"Türkçe\", flag: \"🇹🇷\" },\n\tcs: { name: \"Czech\", nativeName: \"Čeština\", flag: \"🇨🇿\" },\n\tel: { name: \"Greek\", nativeName: \"Ελληνικά\", flag: \"🇬🇷\" },\n\the: { name: \"Hebrew\", nativeName: \"עברית\", flag: \"🇮🇱\" },\n\thu: { name: \"Hungarian\", nativeName: \"Magyar\", flag: \"🇭🇺\" },\n\tid: { name: \"Indonesian\", nativeName: \"Bahasa Indonesia\", flag: \"🇮🇩\" },\n\tth: { name: \"Thai\", nativeName: \"ไทย\", flag: \"🇹🇭\" },\n\tvi: { name: \"Vietnamese\", nativeName: \"Tiếng Việt\", flag: \"🇻🇳\" },\n\tuk: { name: \"Ukrainian\", nativeName: \"Українська\", flag: \"🇺🇦\" },\n\tro: { name: \"Romanian\", nativeName: \"Română\", flag: \"🇷🇴\" },\n\tbg: { name: \"Bulgarian\", nativeName: \"Български\", flag: \"🇧🇬\" },\n\tsk: { name: \"Slovak\", nativeName: \"Slovenčina\", flag: \"🇸🇰\" },\n\tlt: { name: \"Lithuanian\", nativeName: \"Lietuvių\", flag: \"🇱🇹\" },\n\tlv: { name: \"Latvian\", nativeName: \"Latviešu\", flag: \"🇱🇻\" },\n\tet: { name: \"Estonian\", nativeName: \"Eesti\", flag: \"🇪🇪\" },\n\tsl: { name: \"Slovenian\", nativeName: \"Slovenščina\", flag: \"🇸🇮\" },\n\tbs: { name: \"Bosnian\", nativeName: \"Bosanski\", flag: \"🇧🇦\" },\n\thr: { name: \"Croatian\", nativeName: \"Hrvatski\", flag: \"🇭🇷\" },\n\tsr: { name: \"Serbian\", nativeName: \"Српски\", flag: \"🇷🇸\" },\n\tkmr: { name: \"Kurdish\", nativeName: \"Kurdî\", flag: \"🇮🇶\" },\n\tfa: { name: \"Persian\", nativeName: \"فارسی\", flag: \"🇮🇷\" },\n\thi: { name: \"Hindi\", nativeName: \"हिन्दी\", flag: \"🇮🇳\" },\n\tbn: { name: \"Bengali\", nativeName: \"বাংলা\", flag: \"🇧🇩\" },\n\tms: { name: \"Malay\", nativeName: \"Bahasa Melayu\", flag: \"🇲🇾\" },\n};\n\nexport interface LanguageInfo {\n\tcode: string;\n\tname: string;\n\tnativeName: string;\n\tflag: string;\n}\n\nexport function getLanguageInfo(code: string): Omit<LanguageInfo, \"code\"> {\n\tconst normalized = code.toLowerCase();\n\treturn (\n\t\tLANGUAGE_DATA[normalized] ?? {\n\t\t\tname: code.toUpperCase(),\n\t\t\tnativeName: code.toUpperCase(),\n\t\t\tflag: \"🌐\",\n\t\t}\n\t);\n}\n\nexport function getFullLanguageInfo(code: string): LanguageInfo {\n\treturn {\n\t\tcode,\n\t\t...getLanguageInfo(code),\n\t};\n}\n\nexport type LanguageSwitcherDisplay =\n\t| \"flag\"\n\t| \"name\"\n\t| \"native\"\n\t| \"flag-name\"\n\t| \"flag-native\"\n\t| \"code\";\n\nexport function formatLanguageDisplay(\n\tcode: string,\n\tdisplay: LanguageSwitcherDisplay = \"flag-native\",\n): string {\n\tconst info = getLanguageInfo(code);\n\tswitch (display) {\n\t\tcase \"flag\":\n\t\t\treturn info.flag;\n\t\tcase \"name\":\n\t\t\treturn info.name;\n\t\tcase \"native\":\n\t\t\treturn info.nativeName;\n\t\tcase \"flag-name\":\n\t\t\treturn `${info.flag} ${info.name}`;\n\t\tcase \"flag-native\":\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t\tcase \"code\":\n\t\t\treturn code.toUpperCase();\n\t\tdefault:\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t}\n}\n\n// Simple default LanguageSwitcher (backward compatible)\nexport type LanguageSwitcherVariant = \"dropdown\" | \"buttons\" | \"minimal\";\n\nexport interface LanguageSwitcherProps {\n\tclassName?: string;\n\tvariant?: LanguageSwitcherVariant;\n\tdisplay?: LanguageSwitcherDisplay;\n\tonChange?: (language: string) => void;\n}\n\nexport default function LanguageSwitcher({\n\tclassName,\n\tvariant = \"dropdown\",\n\tdisplay = \"flag-native\",\n\tonChange,\n}: LanguageSwitcherProps) {\n\tconst { currentLanguage, availableLanguages, setLanguage } =\n\t\tuseTranslationStore();\n\n\tconst handleChange = (newLanguage: string) => {\n\t\tsetLanguage(newLanguage);\n\t\tonChange?.(newLanguage);\n\t};\n\n\tif (variant === \"buttons\") {\n\t\treturn (\n\t\t\t<div className={className} role=\"group\" aria-label=\"Language selection\">\n\t\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={lang}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handleChange(lang)}\n\t\t\t\t\t\taria-pressed={currentLanguage === lang}\n\t\t\t\t\t\tdata-active={currentLanguage === lang}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === \"minimal\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\t\t\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\t\t\t\thandleChange(availableLanguages[nextIndex]);\n\t\t\t\t}}\n\t\t\t\taria-label={`Current language: ${getLanguageInfo(currentLanguage).name}. Click to change.`}\n\t\t\t>\n\t\t\t\t{formatLanguageDisplay(currentLanguage, display)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<select\n\t\t\tvalue={currentLanguage}\n\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\tclassName={className}\n\t\t\taria-label=\"Select language\"\n\t\t>\n\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t<option key={lang} value={lang}>\n\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t</option>\n\t\t\t))}\n\t\t</select>\n\t);\n}\n","import { useCallback } from \"react\";\nimport { getTranslation, useTranslationStore } from \"../store\";\nimport type { CTFunction, InterpolationValues } from \"../types\";\n\nfunction isInterpolationValues(arg: unknown): arg is InterpolationValues {\n\treturn (\n\t\ttypeof arg === \"object\" &&\n\t\targ !== null &&\n\t\t!Array.isArray(arg) &&\n\t\t!(arg instanceof Date)\n\t);\n}\n\nexport function useCt(): CTFunction {\n\tconst { translations, currentLanguage } = useTranslationStore();\n\n\tconst ct = useCallback(\n\t\t(\n\t\t\ttext: string,\n\t\t\tcontextOrValues?: string | InterpolationValues,\n\t\t\tmaybeValues?: InterpolationValues,\n\t\t): string => {\n\t\t\tlet values: InterpolationValues | undefined;\n\n\t\t\tif (typeof contextOrValues === \"string\") {\n\t\t\t\tvalues = maybeValues;\n\t\t\t} else if (isInterpolationValues(contextOrValues)) {\n\t\t\t\tvalues = contextOrValues;\n\t\t\t}\n\n\t\t\treturn getTranslation(translations, currentLanguage, text, values);\n\t\t},\n\t\t[translations, currentLanguage],\n\t) as CTFunction;\n\n\treturn ct;\n}\n","import React, {\n\tcloneElement,\n\tisValidElement,\n\ttype ReactNode,\n\ttype ReactElement,\n} from \"react\";\nimport { useCt } from \"../hooks/useCt\";\nimport type { InterpolationValues } from \"../types\";\n\nfunction createTagRegex() {\n\treturn /<(\\d+)>(.*?)<\\/\\1>/gs;\n}\n\nexport interface TransProps {\n\tchildren: ReactNode;\n\tcontext?: string;\n\tvalues?: InterpolationValues;\n}\n\ninterface ParsedChild {\n\ttype: \"text\" | \"element\";\n\tcontent: string;\n\telement?: ReactElement;\n\tindex?: number;\n}\n\nfunction parseChildren(children: ReactNode): {\n\ttemplate: string;\n\telements: ReactElement[];\n} {\n\tconst elements: ReactElement[] = [];\n\tlet template = \"\";\n\n\tconst processNode = (node: ReactNode): string => {\n\t\tif (node === null || node === undefined) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (typeof node === \"string\") {\n\t\t\treturn node;\n\t\t}\n\n\t\tif (typeof node === \"number\") {\n\t\t\treturn String(node);\n\t\t}\n\n\t\tif (isValidElement(node)) {\n\t\t\tconst index = elements.length;\n\t\t\telements.push(node);\n\t\t\tconst innerContent = processNode(node.props.children);\n\t\t\treturn `<${index}>${innerContent}</${index}>`;\n\t\t}\n\n\t\tif (Array.isArray(node)) {\n\t\t\treturn node.map(processNode).join(\"\");\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\ttemplate = processNode(children);\n\treturn { template, elements };\n}\n\nfunction reconstructChildren(\n\ttranslated: string,\n\telements: ReactElement[],\n): ReactNode {\n\tif (elements.length === 0) {\n\t\treturn translated;\n\t}\n\n\tconst result: ReactNode[] = [];\n\tlet keyCounter = 0;\n\n\tlet lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\n\tconst tagRegex = createTagRegex();\n\n\twhile ((match = tagRegex.exec(translated)) !== null) {\n\t\t// Add text before the match\n\t\tif (match.index > lastIndex) {\n\t\t\tconst textBefore = translated.slice(lastIndex, match.index);\n\t\t\tif (textBefore) {\n\t\t\t\tresult.push(textBefore);\n\t\t\t}\n\t\t}\n\n\t\tconst elementIndex = parseInt(match[1], 10);\n\t\tconst innerContent = match[2];\n\t\tconst originalElement = elements[elementIndex];\n\n\t\tif (originalElement) {\n\t\t\t// Recursively process inner content in case of nested tags\n\t\t\tconst processedInner = reconstructChildren(innerContent, elements);\n\t\t\tconst cloned = cloneElement(originalElement, {\n\t\t\t\tkey: `trans-${keyCounter++}`,\n\t\t\t\tchildren: processedInner,\n\t\t\t});\n\t\t\tresult.push(cloned);\n\t\t}\n\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\n\t// Add remaining text after last match\n\tif (lastIndex < translated.length) {\n\t\tresult.push(translated.slice(lastIndex));\n\t}\n\n\t// If no matches found, return the original string\n\tif (result.length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn result.length === 1 ? result[0] : result;\n}\n\nexport function Trans({ children, context, values }: TransProps) {\n\tconst ct = useCt();\n\n\t// Parse children to extract template and elements\n\tconst { template, elements } = parseChildren(children);\n\n\t// Translate the template\n\tlet translated: string;\n\tif (context && values) {\n\t\ttranslated = ct(template, context, values);\n\t} else if (context) {\n\t\ttranslated = ct(template, context);\n\t} else if (values) {\n\t\ttranslated = ct(template, values);\n\t} else {\n\t\ttranslated = ct(template);\n\t}\n\n\t// Reconstruct with original elements\n\treturn <>{reconstructChildren(translated, elements)}</>;\n}\n","import { useCallback } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n} from \"../components/LanguageSwitcher\";\n\nexport function useCurrentLanguage(): string {\n\treturn useTranslationStore((state) => state.currentLanguage);\n}\n\nexport function useSetLanguage(): (language: string) => void {\n\treturn useTranslationStore((state) => state.setLanguage);\n}\n\nexport function useAvailableLanguages(): string[] {\n\treturn useTranslationStore((state) => state.availableLanguages);\n}\n\nexport function useIsLoading(): boolean {\n\treturn useTranslationStore((state) => state.isLoading);\n}\n\nexport function useIsReady(): boolean {\n\treturn useTranslationStore((state) => state.isReady);\n}\n\nexport function useLanguageInfo(code?: string): LanguageInfo {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst targetCode = code ?? currentLanguage;\n\treturn getFullLanguageInfo(targetCode);\n}\n\nexport function useAvailableLanguagesInfo(): LanguageInfo[] {\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\treturn availableLanguages.map(getFullLanguageInfo);\n}\n\nexport function useLanguage() {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst isLoading = useTranslationStore((state) => state.isLoading);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\n\tconst currentLanguageInfo = getFullLanguageInfo(currentLanguage);\n\tconst availableLanguagesInfo = availableLanguages.map(getFullLanguageInfo);\n\n\tconst cycleLanguage = useCallback(() => {\n\t\tif (availableLanguages.length === 0) {\n\t\t\tconsole.warn(\"[ciao-tools] Cannot cycle language: no languages available\");\n\t\t\treturn;\n\t\t}\n\t\tif (availableLanguages.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\tsetLanguage(availableLanguages[nextIndex]);\n\t}, [availableLanguages, currentLanguage, setLanguage]);\n\n\treturn {\n\t\tcurrentLanguage,\n\t\tcurrentLanguageInfo,\n\t\tavailableLanguages,\n\t\tavailableLanguagesInfo,\n\t\tsetLanguage,\n\t\tcycleLanguage,\n\t\tisLoading,\n\t\tisReady,\n\t};\n}\n\nexport function getCiaoLanguage(): string {\n\treturn useTranslationStore.getState().currentLanguage;\n}\n\nexport function getCiaoHeaders(): { \"X-Ciao-Language\": string } {\n\treturn {\n\t\t\"X-Ciao-Language\": useTranslationStore.getState().currentLanguage,\n\t};\n}\n\nexport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["options: Intl.DateTimeFormatOptions","result: string","key: string","format: string | undefined","hydrationResolver: (() => void) | null","dbPromise: Promise<IDBDatabase> | null","entry: CacheEntry","updatedLanguages: string[]","originalFetch: typeof fetch | null","LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n>","values: InterpolationValues | undefined","elements: ReactElement[]","result: ReactNode[]","match: RegExpExecArray | null","translated: string"],"sources":["../src/components/CTContextBlock.tsx","../src/interpolate.ts","../src/store.ts","../src/cache.ts","../src/hooks/useHotUpdates.ts","../src/hooks/useManifest.ts","../src/hooks/useTranslationLoader.ts","../src/utils/browserLanguage.ts","../src/hooks/useLanguageInit.ts","../src/hooks/usePreloader.ts","../src/fetchInterceptor.ts","../src/components/CiaoProvider.tsx","../src/components/LanguageSwitcher.tsx","../src/hooks/useCt.ts","../src/components/Trans.tsx","../src/hooks/useLanguage.ts"],"sourcesContent":["import React from \"react\";\nimport type { CTContextBlockProps } from \"../types\";\n\nexport function CTContextBlock({ children }: CTContextBlockProps) {\n\treturn <>{children}</>;\n}\n","export type InterpolationValues = Record<string, unknown>;\n\nconst MAX_CACHE_SIZE = 100;\n\ninterface BoundedCache<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n\thas(key: K): boolean;\n\tclear(): void;\n}\n\nfunction createBoundedCache<K, V>(maxSize: number): BoundedCache<K, V> {\n\tconst cache = new Map<K, V>();\n\treturn {\n\t\tget(key: K): V | undefined {\n\t\t\treturn cache.get(key);\n\t\t},\n\t\tset(key: K, value: V): void {\n\t\t\tif (cache.size >= maxSize) {\n\t\t\t\tconst firstKey = cache.keys().next().value;\n\t\t\t\tif (firstKey !== undefined) {\n\t\t\t\t\tcache.delete(firstKey);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcache.set(key, value);\n\t\t},\n\t\thas(key: K): boolean {\n\t\t\treturn cache.has(key);\n\t\t},\n\t\tclear(): void {\n\t\t\tcache.clear();\n\t\t},\n\t};\n}\n\nconst numberFormatCache = createBoundedCache<string, Intl.NumberFormat>(MAX_CACHE_SIZE);\nconst dateFormatCache = createBoundedCache<string, Intl.DateTimeFormat>(MAX_CACHE_SIZE);\nconst pluralRulesCache = createBoundedCache<string, Intl.PluralRules>(MAX_CACHE_SIZE);\n\nexport function clearFormatterCache(): void {\n\tnumberFormatCache.clear();\n\tdateFormatCache.clear();\n\tpluralRulesCache.clear();\n}\n\nfunction getNumberFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `number:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tmaximumFractionDigits: 20,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getCurrencyFormatter(\n\tlocale: string,\n\tcurrency: string,\n): Intl.NumberFormat {\n\tconst key = `currency:${locale}:${currency}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getPercentFormatter(locale: string): Intl.NumberFormat {\n\tconst key = `percent:${locale}`;\n\tif (!numberFormatCache.has(key)) {\n\t\tnumberFormatCache.set(\n\t\t\tkey,\n\t\t\tnew Intl.NumberFormat(locale, {\n\t\t\t\tstyle: \"percent\",\n\t\t\t\tminimumFractionDigits: 0,\n\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t}),\n\t\t);\n\t}\n\treturn numberFormatCache.get(key)!;\n}\n\nfunction getDateFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `date:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\tdateStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getTimeFormatter(\n\tlocale: string,\n\tstyle: \"short\" | \"medium\" | \"long\" | \"full\",\n): Intl.DateTimeFormat {\n\tconst key = `time:${locale}:${style}`;\n\tif (!dateFormatCache.has(key)) {\n\t\tconst options: Intl.DateTimeFormatOptions = {\n\t\t\ttimeStyle: style,\n\t\t};\n\t\tdateFormatCache.set(key, new Intl.DateTimeFormat(locale, options));\n\t}\n\treturn dateFormatCache.get(key)!;\n}\n\nfunction getPluralRules(locale: string): Intl.PluralRules {\n\tif (!pluralRulesCache.has(locale)) {\n\t\tpluralRulesCache.set(locale, new Intl.PluralRules(locale));\n\t}\n\treturn pluralRulesCache.get(locale)!;\n}\n\nexport function formatValue(\n\tvalue: unknown,\n\tformat: string | undefined,\n\tlocale: string,\n): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\n\tif (!format) {\n\t\treturn String(value);\n\t}\n\n\tconst parts = format.split(\":\");\n\tconst formatType = parts[0];\n\n\tswitch (formatType) {\n\t\tcase \"number\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getNumberFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"currency\": {\n\t\t\tconst currency = parts[1];\n\t\t\tif (!currency) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getCurrencyFormatter(locale, currency).format(num);\n\t\t}\n\n\t\tcase \"percent\": {\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (Number.isNaN(num)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn getPercentFormatter(locale).format(num);\n\t\t}\n\n\t\tcase \"date\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getDateFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"time\": {\n\t\t\tif (!(value instanceof Date)) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst style =\n\t\t\t\t(parts[1] as \"short\" | \"medium\" | \"long\" | \"full\") || \"medium\";\n\t\t\treturn getTimeFormatter(locale, style).format(value);\n\t\t}\n\n\t\tcase \"plural\": {\n\t\t\tconst singular = parts[1];\n\t\t\tconst plural = parts[2];\n\t\t\tif (!singular || !plural) {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\t\tconst rules = getPluralRules(locale);\n\t\t\tconst category = rules.select(num);\n\t\t\treturn category === \"one\" ? singular : plural;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\nexport function interpolate(\n\ttext: string,\n\tvalues: InterpolationValues | undefined,\n\tlocale: string,\n): string {\n\tconst escaped = text.replace(/\\{\\{/g, \"\\x00\").replace(/\\}\\}/g, \"\\x01\");\n\n\tlet result: string;\n\tif (!values || Object.keys(values).length === 0) {\n\t\tresult = escaped;\n\t} else {\n\t\tresult = escaped.replace(/\\{([^}]+)\\}/g, (match, placeholder) => {\n\t\t\tconst trimmed = placeholder.trim();\n\t\t\tconst colonIndex = trimmed.indexOf(\":\");\n\n\t\t\tlet key: string;\n\t\t\tlet format: string | undefined;\n\n\t\t\tif (colonIndex === -1) {\n\t\t\t\tkey = trimmed;\n\t\t\t\tformat = undefined;\n\t\t\t} else {\n\t\t\t\tkey = trimmed.substring(0, colonIndex);\n\t\t\t\tformat = trimmed.substring(colonIndex + 1);\n\t\t\t}\n\n\t\t\tif (!(key in values)) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tconst value = values[key];\n\t\t\treturn formatValue(value, format, locale);\n\t\t});\n\t}\n\n\treturn result.replace(/\\x00/g, \"{\").replace(/\\x01/g, \"}\");\n}\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { interpolate } from \"./interpolate\";\nimport type {\n\tInterpolationValues,\n\tLanguageTranslations,\n\tStoredManifest,\n\tTranslationMap,\n\tTranslationStore,\n} from \"./types\";\n\nlet hydrationResolver: (() => void) | null = null;\nconst hydrationPromise = new Promise<void>((resolve) => {\n\thydrationResolver = resolve;\n});\n\nexport const useTranslationStore = create<TranslationStore>()(\n\tpersist(\n\t\t(set) => ({\n\t\t\tcurrentLanguage: \"en\",\n\t\t\tdefaultLanguage: \"en\",\n\t\t\tavailableLanguages: [\"en\"],\n\t\t\ttranslations: {},\n\t\t\tisLoading: false,\n\t\t\tisReady: false,\n\t\t\tisHydrated: false,\n\t\t\tstoredManifest: null,\n\t\t\tlastVersionCheck: null,\n\n\t\t\tsetLanguage: (language: string) => {\n\t\t\t\tset({ currentLanguage: language, isReady: false });\n\t\t\t},\n\n\t\t\tloadTranslations: (translations: LanguageTranslations) => {\n\t\t\t\tset((state) => {\n\t\t\t\t\tconst languages = Object.keys(translations);\n\t\t\t\t\tconst availableLanguages = [\n\t\t\t\t\t\t...new Set([...state.availableLanguages, ...languages]),\n\t\t\t\t\t];\n\t\t\t\t\tconst merged = { ...state.translations };\n\t\t\t\t\tfor (const lang of languages) {\n\t\t\t\t\t\tmerged[lang] = { ...merged[lang], ...translations[lang] };\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttranslations: merged,\n\t\t\t\t\t\tavailableLanguages,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\n\t\t\taddLanguage: (language: string, translations: TranslationMap) => {\n\t\t\t\tset((state) => ({\n\t\t\t\t\ttranslations: {\n\t\t\t\t\t\t...state.translations,\n\t\t\t\t\t\t[language]: { ...state.translations[language], ...translations },\n\t\t\t\t\t},\n\t\t\t\t\tavailableLanguages: state.availableLanguages.includes(language)\n\t\t\t\t\t\t? state.availableLanguages\n\t\t\t\t\t\t: [...state.availableLanguages, language],\n\t\t\t\t}));\n\t\t\t},\n\n\t\t\tsetLoading: (loading: boolean) => {\n\t\t\t\tset({ isLoading: loading });\n\t\t\t},\n\n\t\t\tsetReady: (ready: boolean) => {\n\t\t\t\tset({ isReady: ready });\n\t\t\t},\n\n\t\t\tsetStoredManifest: (manifest: StoredManifest) => {\n\t\t\t\tset({ storedManifest: manifest, lastVersionCheck: Date.now() });\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: \"ciao-tools-language\",\n\t\t\tpartialize: (state) => ({\n\t\t\t\tcurrentLanguage: state.currentLanguage,\n\t\t\t\tstoredManifest: state.storedManifest,\n\t\t\t}),\n\t\t\tonRehydrateStorage: () => (_, error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconsole.error(\"[ciao-tools] Storage hydration failed:\", error);\n\t\t\t\t}\n\t\t\t\tif (hydrationResolver) {\n\t\t\t\t\thydrationResolver();\n\t\t\t\t\thydrationResolver = null;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t),\n);\n\nhydrationPromise.then(() => {\n\tuseTranslationStore.setState({ isHydrated: true });\n});\n\nexport function getTranslation(\n\ttranslations: LanguageTranslations,\n\tlanguage: string,\n\ttext: string,\n\tvalues?: InterpolationValues,\n): string {\n\tconst translated = translations[language]?.[text] ?? text;\n\n\tif (!values || Object.keys(values).length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn interpolate(translated, values, language);\n}\n","import type { TranslationMap } from \"./types\";\n\nconst DB_NAME = \"ciao-tools-translations\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"translations\";\n\ninterface CacheEntry {\n\tlanguage: string;\n\tprojectId: string;\n\tdata: TranslationMap;\n\turl: string;\n\tcachedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction openDB(): Promise<IDBDatabase> {\n\tif (dbPromise) return dbPromise;\n\n\tdbPromise = new Promise((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\tdbPromise = null;\n\t\t\treject(new Error(\"IndexedDB not available\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst request = indexedDB.open(DB_NAME, DB_VERSION);\n\n\t\trequest.onerror = () => {\n\t\t\tdbPromise = null;\n\t\t\treject(request.error);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\t\t\tif (!db.objectStoreNames.contains(STORE_NAME)) {\n\t\t\t\tconst store = db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n\t\t\t\tstore.createIndex(\"language\", \"language\", { unique: false });\n\t\t\t\tstore.createIndex(\"projectId\", \"projectId\", { unique: false });\n\t\t\t}\n\t\t};\n\t});\n\n\treturn dbPromise;\n}\n\nexport async function getCachedTranslation(\n\turl: string,\n): Promise<TranslationMap | null> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\t\t\tconst request = store.get(url);\n\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst entry = request.result as CacheEntry | undefined;\n\t\t\t\tresolve(entry?.data ?? null);\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to read from cache:\", error);\n\t\treturn null;\n\t}\n}\n\nexport async function cacheTranslation(\n\turl: string,\n\tlanguage: string,\n\tprojectId: string,\n\tdata: TranslationMap,\n): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst entry: CacheEntry = {\n\t\t\t\turl,\n\t\t\t\tlanguage,\n\t\t\t\tprojectId,\n\t\t\t\tdata,\n\t\t\t\tcachedAt: Date.now(),\n\t\t\t};\n\n\t\t\tconst request = store.put(entry);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t\trequest.onsuccess = () => resolve();\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to write to cache:\", error);\n\t}\n}\n\nexport async function clearCache(projectId?: string): Promise<void> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readwrite\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tif (projectId) {\n\t\t\t\tconst index = store.index(\"projectId\");\n\t\t\t\tconst request = index.openCursor(IDBKeyRange.only(projectId));\n\t\t\t\trequest.onsuccess = (event) => {\n\t\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\tcursor.delete();\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttransaction.oncomplete = () => resolve();\n\t\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t\t} else {\n\t\t\t\tconst request = store.clear();\n\t\t\t\trequest.onerror = () => reject(request.error);\n\t\t\t\trequest.onsuccess = () => resolve();\n\t\t\t}\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to clear cache:\", error);\n\t}\n}\n\nexport async function getCacheStats(): Promise<{\n\tcount: number;\n\tlanguages: string[];\n}> {\n\ttry {\n\t\tconst db = await openDB();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst transaction = db.transaction(STORE_NAME, \"readonly\");\n\t\t\tconst store = transaction.objectStore(STORE_NAME);\n\n\t\t\tconst countRequest = store.count();\n\t\t\tconst languages = new Set<string>();\n\n\t\t\tconst cursorRequest = store.openCursor();\n\t\t\tcursorRequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = (event.target as IDBRequest).result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tlanguages.add((cursor.value as CacheEntry).language);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttransaction.oncomplete = () => {\n\t\t\t\tresolve({\n\t\t\t\t\tcount: countRequest.result,\n\t\t\t\t\tlanguages: Array.from(languages),\n\t\t\t\t});\n\t\t\t};\n\t\t\ttransaction.onerror = () => reject(transaction.error);\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to get cache stats:\", error);\n\t\treturn { count: 0, languages: [] };\n\t}\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { clearCache, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { HotUpdateConfig, StoredManifest, TranslationMap } from \"../types\";\n\nconst CDN_BASE_URL = \"https://t1.ciao-tools.com\";\n\ninterface LatestManifest {\n\tversion: number;\n\tupdatedAt: string;\n\turls: Record<string, string>;\n}\n\nasync function fetchLatestManifest(projectId: string): Promise<LatestManifest | null> {\n\tconst url = `${CDN_BASE_URL}/translations/${projectId}/latest.json`;\n\ttry {\n\t\tconst response = await fetch(url, { cache: \"no-cache\" });\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 404) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to fetch latest manifest: ${response.statusText}`);\n\t\t}\n\t\treturn response.json();\n\t} catch (error) {\n\t\tconsole.warn(\"[ciao-tools] Failed to fetch latest manifest:\", error);\n\t\treturn null;\n\t}\n}\n\nasync function fetchTranslations(url: string): Promise<TranslationMap> {\n\tconst response = await fetch(url);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useHotUpdates(\n\tconfig: HotUpdateConfig | undefined,\n\tprojectId: string | undefined,\n\tsourceLanguage: string | undefined,\n) {\n\tconst isCheckingRef = useRef(false);\n\tconst hasCheckedOnMountRef = useRef(false);\n\n\tconst configRef = useRef(config);\n\tconst projectIdRef = useRef(projectId);\n\tconst sourceLanguageRef = useRef(sourceLanguage);\n\n\tuseEffect(() => {\n\t\tconfigRef.current = config;\n\t\tprojectIdRef.current = projectId;\n\t\tsourceLanguageRef.current = sourceLanguage;\n\t}, [config, projectId, sourceLanguage]);\n\n\tconst { setStoredManifest, addLanguage } = useTranslationStore();\n\n\tconst checkForUpdates = useCallback(async () => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\t\tconst currentSourceLanguage = sourceLanguageRef.current;\n\n\t\tif (!currentConfig || !currentProjectId || isCheckingRef.current) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tisCheckingRef.current = true;\n\n\t\ttry {\n\t\t\tconsole.log(\"[ciao-tools] Checking for hot updates...\");\n\t\t\tconst latestManifest = await fetchLatestManifest(currentProjectId);\n\n\t\t\tif (!latestManifest) {\n\t\t\t\tconsole.log(\"[ciao-tools] No latest.json found (project may not have hot updates yet)\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\"[ciao-tools] Found latest.json, version:\", latestManifest.version);\n\n\t\t\tconst currentManifest = useTranslationStore.getState().storedManifest;\n\t\t\tconst currentVersion = currentManifest?.serverVersion ?? null;\n\t\t\tconst isFirstCheck = currentVersion === null;\n\t\t\tconst hasNewVersion = currentVersion !== null && latestManifest.version > currentVersion;\n\n\t\t\tif (isFirstCheck || hasNewVersion) {\n\t\t\t\tif (Object.keys(latestManifest.urls).length > 0) {\n\t\t\t\t\tconst reason = hasNewVersion ? \"new version\" : \"first check\";\n\t\t\t\t\tconsole.log(`[ciao-tools] Fetching translations (${reason})...`);\n\n\t\t\t\t\tif (hasNewVersion) {\n\t\t\t\t\t\tawait clearCache(currentProjectId);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst updatedLanguages: string[] = [];\n\n\t\t\t\t\tfor (const [langCode, url] of Object.entries(latestManifest.urls)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst translations = await fetchTranslations(url);\n\t\t\t\t\t\t\taddLanguage(langCode, translations);\n\t\t\t\t\t\t\tawait cacheTranslation(url, langCode, currentProjectId, translations);\n\t\t\t\t\t\t\tupdatedLanguages.push(langCode);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(`[ciao-tools] Failed to fetch ${langCode} translations:`, err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedLanguages.length > 0) {\n\t\t\t\t\t\tconsole.log(\"[ciao-tools] Updated translations for:\", updatedLanguages);\n\t\t\t\t\t\tif (hasNewVersion && currentConfig.onTranslationsUpdated) {\n\t\t\t\t\t\t\tcurrentConfig.onTranslationsUpdated(updatedLanguages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newStoredManifest: StoredManifest = {\n\t\t\t\t\tserverVersion: latestManifest.version,\n\t\t\t\t\tupdatedAt: latestManifest.updatedAt,\n\t\t\t\t\tprojectId: currentProjectId,\n\t\t\t\t\tsourceLanguage: currentManifest?.sourceLanguage ?? currentSourceLanguage ?? \"en\",\n\t\t\t\t\tlanguages: Object.keys(latestManifest.urls),\n\t\t\t\t\tcdnUrls: latestManifest.urls,\n\t\t\t\t};\n\n\t\t\t\tsetStoredManifest(newStoredManifest);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"[ciao-tools] Already up to date (version \" + latestManifest.version + \")\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[ciao-tools] Hot update check failed:\", error);\n\t\t} finally {\n\t\t\tisCheckingRef.current = false;\n\t\t}\n\t}, [setStoredManifest, addLanguage]);\n\n\tuseEffect(() => {\n\t\tconst currentConfig = configRef.current;\n\t\tconst currentProjectId = projectIdRef.current;\n\n\t\tif (!currentConfig || !currentProjectId) return;\n\t\tif (currentConfig.enabled !== true) return;\n\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tif (!hasCheckedOnMountRef.current) {\n\t\t\thasCheckedOnMountRef.current = true;\n\t\t\tcheckForUpdates();\n\t\t}\n\n\t\tconst handleVisibilityChange = () => {\n\t\t\tif (document.visibilityState === \"visible\") {\n\t\t\t\tcheckForUpdates();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n\t\t};\n\t}, [checkForUpdates]);\n\n\treturn { checkForUpdates };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, StoredManifest } from \"../types\";\n\nexport interface UseManifestOptions {\n\tmanifest?: CiaoManifest;\n}\n\nexport interface UseManifestResult {\n\teffectiveManifest: CiaoManifest | undefined;\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\thasManifestChanged: boolean;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n}\n\nfunction getManifestUrlsHash(manifest: CiaoManifest | undefined): string {\n\tif (!manifest) return \"\";\n\treturn JSON.stringify(manifest.cdnUrls);\n}\n\nexport function useManifest({ manifest }: UseManifestOptions): UseManifestResult {\n\tconst storedManifest = useTranslationStore((state) => state.storedManifest);\n\n\tconst effectiveManifest = useMemo((): CiaoManifest | undefined => {\n\t\tif (storedManifest && storedManifest.projectId === manifest?.projectId) {\n\t\t\treturn {\n\t\t\t\tversion: String(storedManifest.serverVersion),\n\t\t\t\tprojectId: storedManifest.projectId,\n\t\t\t\tsourceLanguage: storedManifest.sourceLanguage,\n\t\t\t\tlanguages: storedManifest.languages,\n\t\t\t\tcdnUrls: storedManifest.cdnUrls,\n\t\t\t\tgeneratedAt: storedManifest.updatedAt,\n\t\t\t};\n\t\t}\n\t\treturn manifest;\n\t}, [storedManifest, manifest]);\n\n\tconst manifestRef = useRef<CiaoManifest | undefined>(effectiveManifest);\n\tconst previousManifestHashRef = useRef<string>(\"\");\n\tconst loadedUrlsRef = useRef<Map<string, string>>(new Map());\n\tconst hasManifestChangedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tmanifestRef.current = effectiveManifest;\n\n\t\tconst newHash = getManifestUrlsHash(effectiveManifest);\n\t\tconst oldHash = previousManifestHashRef.current;\n\n\t\tif (oldHash && newHash && oldHash !== newHash) {\n\t\t\tloadedUrlsRef.current.clear();\n\t\t\tuseTranslationStore.setState({ translations: {} });\n\t\t\thasManifestChangedRef.current = true;\n\t\t} else {\n\t\t\thasManifestChangedRef.current = false;\n\t\t}\n\n\t\tpreviousManifestHashRef.current = newHash;\n\t}, [effectiveManifest]);\n\n\treturn {\n\t\teffectiveManifest,\n\t\tmanifestRef,\n\t\thasManifestChanged: hasManifestChangedRef.current,\n\t\tloadedUrlsRef,\n\t};\n}\n","import { useCallback, useRef } from \"react\";\nimport { getCachedTranslation, cacheTranslation } from \"../cache\";\nimport { useTranslationStore } from \"../store\";\nimport type { CiaoManifest, TranslationMap } from \"../types\";\n\nexport interface UseTranslationLoaderOptions {\n\tmanifestRef: React.RefObject<CiaoManifest | undefined>;\n\tloadedUrlsRef: React.RefObject<Map<string, string>>;\n\thotUpdatesEnabled?: boolean;\n}\n\nexport interface UseTranslationLoaderResult {\n\tloadLanguage: (language: string, isPreload?: boolean) => Promise<boolean>;\n\tabortControllerRef: React.RefObject<AbortController | null>;\n}\n\nasync function fetchTranslationsFromCDN(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<TranslationMap> {\n\tconst response = await fetch(url, { signal });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch translations: ${response.statusText}`);\n\t}\n\treturn response.json();\n}\n\nexport function useTranslationLoader({\n\tmanifestRef,\n\tloadedUrlsRef,\n\thotUpdatesEnabled,\n}: UseTranslationLoaderOptions): UseTranslationLoaderResult {\n\tconst addLanguage = useTranslationStore((state) => state.addLanguage);\n\tconst setLoading = useTranslationStore((state) => state.setLoading);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst loadLanguage = useCallback(\n\t\tasync (language: string, isPreload = false): Promise<boolean> => {\n\t\t\tconst currentManifest = manifestRef.current;\n\t\t\tif (!currentManifest) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst cdnUrl = currentManifest.cdnUrls[language];\n\n\t\t\tif (!cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst loadedUrl = loadedUrlsRef.current.get(language);\n\t\t\tif (loadedUrl === cdnUrl) {\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!isPreload) {\n\t\t\t\tif (abortControllerRef.current) {\n\t\t\t\t\tabortControllerRef.current.abort();\n\t\t\t\t}\n\t\t\t\tabortControllerRef.current = new AbortController();\n\t\t\t}\n\n\t\t\tconst controller = isPreload ? undefined : abortControllerRef.current;\n\n\t\t\tif (!isPreload) {\n\t\t\t\tsetLoading(true);\n\t\t\t\tsetReady(false);\n\t\t\t}\n\n\t\t\tconst useCache = hotUpdatesEnabled !== true;\n\n\t\t\ttry {\n\t\t\t\tif (useCache) {\n\t\t\t\t\tconst cached = await getCachedTranslation(cdnUrl);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\tif (controller?.signal.aborted) return false;\n\t\t\t\t\t\taddLanguage(language, cached);\n\t\t\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\t\t\t\t\t\tif (!isPreload) {\n\t\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst translationData = await fetchTranslationsFromCDN(\n\t\t\t\t\tcdnUrl,\n\t\t\t\t\tcontroller?.signal,\n\t\t\t\t);\n\n\t\t\t\tif (controller?.signal.aborted) return false;\n\n\t\t\t\taddLanguage(language, translationData);\n\t\t\t\tloadedUrlsRef.current.set(language, cdnUrl);\n\n\t\t\t\tif (useCache) {\n\t\t\t\t\tawait cacheTranslation(\n\t\t\t\t\t\tcdnUrl,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tcurrentManifest.projectId,\n\t\t\t\t\t\ttranslationData,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[ciao-tools] Failed to load translations for ${language}:`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tif (!isPreload) setReady(true);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tif (!isPreload) setLoading(false);\n\t\t\t}\n\t\t},\n\t\t[manifestRef, loadedUrlsRef, hotUpdatesEnabled, addLanguage, setLoading, setReady],\n\t);\n\n\treturn { loadLanguage, abortControllerRef };\n}\n","export function detectBrowserLanguage(availableLanguages: string[]): string | null {\n\tif (typeof navigator === \"undefined\") return null;\n\n\tconst browserLangs = navigator.languages || [navigator.language];\n\n\tfor (const browserLang of browserLangs) {\n\t\tconst normalized = browserLang.toLowerCase();\n\t\tif (availableLanguages.includes(normalized)) {\n\t\t\treturn normalized;\n\t\t}\n\t\tconst langCode = normalized.split(\"-\")[0];\n\t\tif (availableLanguages.includes(langCode)) {\n\t\t\treturn langCode;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useRef } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { detectBrowserLanguage } from \"../utils/browserLanguage\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UseLanguageInitOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tavailableLanguages?: string[];\n\tdefaultLanguage: string;\n\tdetectLanguage: boolean;\n}\n\nexport function useLanguageInit({\n\teffectiveManifest,\n\tavailableLanguages,\n\tdefaultLanguage,\n\tdetectLanguage,\n}: UseLanguageInitOptions): void {\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst initializedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\t\tif (initializedRef.current) return;\n\t\tinitializedRef.current = true;\n\n\t\tconst store = useTranslationStore.getState();\n\t\tconst effectiveLanguages = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages || [];\n\n\t\tconst hasPersistedLanguage =\n\t\t\tstore.currentLanguage &&\n\t\t\tstore.currentLanguage !== \"en\" &&\n\t\t\teffectiveLanguages.includes(store.currentLanguage);\n\n\t\tif (hasPersistedLanguage) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (detectLanguage && effectiveLanguages.length > 0) {\n\t\t\tconst detected = detectBrowserLanguage(effectiveLanguages);\n\t\t\tif (detected) {\n\t\t\t\tsetLanguage(detected);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (defaultLanguage && defaultLanguage !== store.currentLanguage) {\n\t\t\tsetLanguage(defaultLanguage);\n\t\t}\n\t}, [\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t\tsetLanguage,\n\t\tisHydrated,\n\t]);\n}\n","import { useEffect, useRef } from \"react\";\nimport type { CiaoManifest } from \"../types\";\n\nexport interface UsePreloaderOptions {\n\teffectiveManifest: CiaoManifest | undefined;\n\tcurrentLanguage: string;\n\tdelay: number;\n\tenabled: boolean;\n\tloadLanguage: (language: string, isPreload: boolean) => Promise<boolean>;\n}\n\nexport function usePreloader({\n\teffectiveManifest,\n\tcurrentLanguage,\n\tdelay,\n\tenabled,\n\tloadLanguage,\n}: UsePreloaderOptions): void {\n\tconst preloadTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst isMountedRef = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMountedRef.current = true;\n\t\treturn () => {\n\t\t\tisMountedRef.current = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!enabled || !effectiveManifest) return;\n\n\t\tif (preloadTimeoutRef.current) {\n\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t}\n\n\t\tpreloadTimeoutRef.current = setTimeout(async () => {\n\t\t\tif (!isMountedRef.current) return;\n\n\t\t\tconst languages = [...effectiveManifest.languages];\n\t\t\tfor (const language of languages) {\n\t\t\t\tif (!isMountedRef.current) break;\n\t\t\t\tif (language === effectiveManifest.sourceLanguage) continue;\n\t\t\t\tif (language === currentLanguage) continue;\n\n\t\t\t\tawait loadLanguage(language, true);\n\t\t\t}\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tif (preloadTimeoutRef.current) {\n\t\t\t\tclearTimeout(preloadTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, [effectiveManifest, currentLanguage, enabled, delay, loadLanguage]);\n}\n","import { useTranslationStore } from \"./store\";\n\nlet originalFetch: typeof fetch | null = null;\nlet isPatched = false;\n\nfunction getHeaders(): { \"X-Ciao-Language\": string; \"Accept-Language\": string } {\n\tconst currentLanguage = useTranslationStore.getState().currentLanguage;\n\tconst defaultLanguage = useTranslationStore.getState().defaultLanguage;\n\n\tlet acceptLanguage = currentLanguage;\n\tif (defaultLanguage && defaultLanguage !== currentLanguage) {\n\t\tacceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;\n\t}\n\n\treturn {\n\t\t\"X-Ciao-Language\": currentLanguage,\n\t\t\"Accept-Language\": acceptLanguage,\n\t};\n}\n\nexport function patchGlobalFetch(): void {\n\tif (typeof window === \"undefined\" || typeof fetch === \"undefined\") {\n\t\treturn;\n\t}\n\n\tif (isPatched) {\n\t\treturn;\n\t}\n\n\toriginalFetch = window.fetch;\n\tisPatched = true;\n\n\twindow.fetch = function (\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit,\n\t): Promise<Response> {\n\t\tconst headers = getHeaders();\n\t\tconst mergedHeaders = new Headers(init?.headers);\n\n\t\tif (!mergedHeaders.has(\"X-Ciao-Language\")) {\n\t\t\tmergedHeaders.set(\"X-Ciao-Language\", headers[\"X-Ciao-Language\"]);\n\t\t}\n\t\tif (!mergedHeaders.has(\"Accept-Language\")) {\n\t\t\tmergedHeaders.set(\"Accept-Language\", headers[\"Accept-Language\"]);\n\t\t}\n\n\t\treturn originalFetch!(input, {\n\t\t\t...init,\n\t\t\theaders: mergedHeaders,\n\t\t});\n\t};\n}\n\nexport function unpatchGlobalFetch(): void {\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\n\tif (!isPatched || !originalFetch) {\n\t\treturn;\n\t}\n\n\twindow.fetch = originalFetch;\n\toriginalFetch = null;\n\tisPatched = false;\n}\n\nexport function isFetchPatched(): boolean {\n\treturn isPatched;\n}\n","import React, { useEffect } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport { useHotUpdates } from \"../hooks/useHotUpdates\";\nimport { useManifest } from \"../hooks/useManifest\";\nimport { useTranslationLoader } from \"../hooks/useTranslationLoader\";\nimport { useLanguageInit } from \"../hooks/useLanguageInit\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport { patchGlobalFetch, unpatchGlobalFetch } from \"../fetchInterceptor\";\nimport type { CiaoProviderProps } from \"../types\";\n\nconst PRELOAD_DELAY_MS = 5000;\n\nexport function CiaoProvider({\n\tchildren,\n\ttranslations,\n\tmanifest,\n\tdefaultLanguage = \"en\",\n\tavailableLanguages,\n\tonLanguageChange,\n\tdetectLanguage = true,\n\tblockUntilReady = true,\n\tfallback = null,\n\tpreloadLanguages = true,\n\tpreloadDelay = PRELOAD_DELAY_MS,\n\thotUpdates = { enabled: true },\n\tautoInjectHeaders = true,\n}: CiaoProviderProps) {\n\tconst loadTranslations = useTranslationStore((state) => state.loadTranslations);\n\tconst setReady = useTranslationStore((state) => state.setReady);\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\tconst isHydrated = useTranslationStore((state) => state.isHydrated);\n\n\tconst { effectiveManifest, manifestRef, loadedUrlsRef } = useManifest({ manifest });\n\n\tconst { loadLanguage, abortControllerRef } = useTranslationLoader({\n\t\tmanifestRef,\n\t\tloadedUrlsRef,\n\t\thotUpdatesEnabled: hotUpdates?.enabled,\n\t});\n\n\tuseLanguageInit({\n\t\teffectiveManifest,\n\t\tavailableLanguages,\n\t\tdefaultLanguage,\n\t\tdetectLanguage,\n\t});\n\n\tusePreloader({\n\t\teffectiveManifest,\n\t\tcurrentLanguage,\n\t\tdelay: preloadDelay,\n\t\tenabled: preloadLanguages,\n\t\tloadLanguage,\n\t});\n\n\tuseHotUpdates(hotUpdates, manifest?.projectId, manifest?.sourceLanguage);\n\n\tuseEffect(() => {\n\t\tif (translations) {\n\t\t\tloadTranslations(translations);\n\t\t\tsetReady(true);\n\t\t}\n\t}, [translations, loadTranslations, setReady]);\n\n\tuseEffect(() => {\n\t\tconst languagesList = effectiveManifest\n\t\t\t? [...effectiveManifest.languages]\n\t\t\t: availableLanguages;\n\n\t\tif (languagesList) {\n\t\t\tconst store = useTranslationStore.getState();\n\t\t\tconst merged = [\n\t\t\t\t...new Set([...store.availableLanguages, ...languagesList]),\n\t\t\t];\n\t\t\tuseTranslationStore.setState({\n\t\t\t\tavailableLanguages: merged,\n\t\t\t\tdefaultLanguage,\n\t\t\t});\n\t\t}\n\t}, [availableLanguages, effectiveManifest, defaultLanguage]);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (currentLanguage === effectiveManifest?.sourceLanguage) {\n\t\t\tsetReady(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (effectiveManifest && currentLanguage) {\n\t\t\tloadLanguage(currentLanguage, false);\n\t\t} else if (!effectiveManifest) {\n\t\t\tsetReady(true);\n\t\t}\n\t}, [effectiveManifest, currentLanguage, loadLanguage, setReady, isHydrated]);\n\n\tuseEffect(() => {\n\t\tif (onLanguageChange) {\n\t\t\tonLanguageChange(currentLanguage);\n\t\t}\n\t}, [currentLanguage, onLanguageChange]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t};\n\t}, [abortControllerRef]);\n\n\tuseEffect(() => {\n\t\tif (autoInjectHeaders) {\n\t\t\tpatchGlobalFetch();\n\t\t}\n\t\treturn () => {\n\t\t\tif (autoInjectHeaders) {\n\t\t\t\tunpatchGlobalFetch();\n\t\t\t}\n\t\t};\n\t}, [autoInjectHeaders]);\n\n\tif (blockUntilReady && (!isReady || !isHydrated)) {\n\t\treturn <>{fallback}</>;\n\t}\n\n\treturn <>{children}</>;\n}\n","import React, { createContext, useContext, useCallback, type ReactNode } from \"react\";\nimport { useTranslationStore } from \"../store\";\n\nexport const LANGUAGE_DATA: Record<\n\tstring,\n\t{ name: string; nativeName: string; flag: string }\n> = {\n\ten: { name: \"English\", nativeName: \"English\", flag: \"🇺🇸\" },\n\tes: { name: \"Spanish\", nativeName: \"Español\", flag: \"🇪🇸\" },\n\tfr: { name: \"French\", nativeName: \"Français\", flag: \"🇫🇷\" },\n\tde: { name: \"German\", nativeName: \"Deutsch\", flag: \"🇩🇪\" },\n\tit: { name: \"Italian\", nativeName: \"Italiano\", flag: \"🇮🇹\" },\n\tpt: { name: \"Portuguese\", nativeName: \"Português\", flag: \"🇵🇹\" },\n\tja: { name: \"Japanese\", nativeName: \"日本語\", flag: \"🇯🇵\" },\n\tko: { name: \"Korean\", nativeName: \"한국어\", flag: \"🇰🇷\" },\n\tzh: { name: \"Chinese\", nativeName: \"中文\", flag: \"🇨🇳\" },\n\tar: { name: \"Arabic\", nativeName: \"العربية\", flag: \"🇸🇦\" },\n\tru: { name: \"Russian\", nativeName: \"Русский\", flag: \"🇷🇺\" },\n\tnl: { name: \"Dutch\", nativeName: \"Nederlands\", flag: \"🇳🇱\" },\n\tpl: { name: \"Polish\", nativeName: \"Polski\", flag: \"🇵🇱\" },\n\tsv: { name: \"Swedish\", nativeName: \"Svenska\", flag: \"🇸🇪\" },\n\tda: { name: \"Danish\", nativeName: \"Dansk\", flag: \"🇩🇰\" },\n\tfi: { name: \"Finnish\", nativeName: \"Suomi\", flag: \"🇫🇮\" },\n\tno: { name: \"Norwegian\", nativeName: \"Norsk\", flag: \"🇳🇴\" },\n\ttr: { name: \"Turkish\", nativeName: \"Türkçe\", flag: \"🇹🇷\" },\n\tcs: { name: \"Czech\", nativeName: \"Čeština\", flag: \"🇨🇿\" },\n\tel: { name: \"Greek\", nativeName: \"Ελληνικά\", flag: \"🇬🇷\" },\n\the: { name: \"Hebrew\", nativeName: \"עברית\", flag: \"🇮🇱\" },\n\thu: { name: \"Hungarian\", nativeName: \"Magyar\", flag: \"🇭🇺\" },\n\tid: { name: \"Indonesian\", nativeName: \"Bahasa Indonesia\", flag: \"🇮🇩\" },\n\tth: { name: \"Thai\", nativeName: \"ไทย\", flag: \"🇹🇭\" },\n\tvi: { name: \"Vietnamese\", nativeName: \"Tiếng Việt\", flag: \"🇻🇳\" },\n\tuk: { name: \"Ukrainian\", nativeName: \"Українська\", flag: \"🇺🇦\" },\n\tro: { name: \"Romanian\", nativeName: \"Română\", flag: \"🇷🇴\" },\n\tbg: { name: \"Bulgarian\", nativeName: \"Български\", flag: \"🇧🇬\" },\n\tsk: { name: \"Slovak\", nativeName: \"Slovenčina\", flag: \"🇸🇰\" },\n\tlt: { name: \"Lithuanian\", nativeName: \"Lietuvių\", flag: \"🇱🇹\" },\n\tlv: { name: \"Latvian\", nativeName: \"Latviešu\", flag: \"🇱🇻\" },\n\tet: { name: \"Estonian\", nativeName: \"Eesti\", flag: \"🇪🇪\" },\n\tsl: { name: \"Slovenian\", nativeName: \"Slovenščina\", flag: \"🇸🇮\" },\n\tbs: { name: \"Bosnian\", nativeName: \"Bosanski\", flag: \"🇧🇦\" },\n\thr: { name: \"Croatian\", nativeName: \"Hrvatski\", flag: \"🇭🇷\" },\n\tsr: { name: \"Serbian\", nativeName: \"Српски\", flag: \"🇷🇸\" },\n\tkmr: { name: \"Kurdish\", nativeName: \"Kurdî\", flag: \"🇮🇶\" },\n\tfa: { name: \"Persian\", nativeName: \"فارسی\", flag: \"🇮🇷\" },\n\thi: { name: \"Hindi\", nativeName: \"हिन्दी\", flag: \"🇮🇳\" },\n\tbn: { name: \"Bengali\", nativeName: \"বাংলা\", flag: \"🇧🇩\" },\n\tms: { name: \"Malay\", nativeName: \"Bahasa Melayu\", flag: \"🇲🇾\" },\n};\n\nexport interface LanguageInfo {\n\tcode: string;\n\tname: string;\n\tnativeName: string;\n\tflag: string;\n}\n\nexport function getLanguageInfo(code: string): Omit<LanguageInfo, \"code\"> {\n\tconst normalized = code.toLowerCase();\n\treturn (\n\t\tLANGUAGE_DATA[normalized] ?? {\n\t\t\tname: code.toUpperCase(),\n\t\t\tnativeName: code.toUpperCase(),\n\t\t\tflag: \"🌐\",\n\t\t}\n\t);\n}\n\nexport function getFullLanguageInfo(code: string): LanguageInfo {\n\treturn {\n\t\tcode,\n\t\t...getLanguageInfo(code),\n\t};\n}\n\nexport type LanguageSwitcherDisplay =\n\t| \"flag\"\n\t| \"name\"\n\t| \"native\"\n\t| \"flag-name\"\n\t| \"flag-native\"\n\t| \"code\";\n\nexport function formatLanguageDisplay(\n\tcode: string,\n\tdisplay: LanguageSwitcherDisplay = \"flag-native\",\n): string {\n\tconst info = getLanguageInfo(code);\n\tswitch (display) {\n\t\tcase \"flag\":\n\t\t\treturn info.flag;\n\t\tcase \"name\":\n\t\t\treturn info.name;\n\t\tcase \"native\":\n\t\t\treturn info.nativeName;\n\t\tcase \"flag-name\":\n\t\t\treturn `${info.flag} ${info.name}`;\n\t\tcase \"flag-native\":\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t\tcase \"code\":\n\t\t\treturn code.toUpperCase();\n\t\tdefault:\n\t\t\treturn `${info.flag} ${info.nativeName}`;\n\t}\n}\n\n// Simple default LanguageSwitcher (backward compatible)\nexport type LanguageSwitcherVariant = \"dropdown\" | \"buttons\" | \"minimal\";\n\nexport interface LanguageSwitcherProps {\n\tclassName?: string;\n\tvariant?: LanguageSwitcherVariant;\n\tdisplay?: LanguageSwitcherDisplay;\n\tonChange?: (language: string) => void;\n}\n\nexport default function LanguageSwitcher({\n\tclassName,\n\tvariant = \"dropdown\",\n\tdisplay = \"flag-native\",\n\tonChange,\n}: LanguageSwitcherProps) {\n\tconst { currentLanguage, availableLanguages, setLanguage } =\n\t\tuseTranslationStore();\n\n\tconst handleChange = (newLanguage: string) => {\n\t\tsetLanguage(newLanguage);\n\t\tonChange?.(newLanguage);\n\t};\n\n\tif (variant === \"buttons\") {\n\t\treturn (\n\t\t\t<div className={className} role=\"group\" aria-label=\"Language selection\">\n\t\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={lang}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handleChange(lang)}\n\t\t\t\t\t\taria-pressed={currentLanguage === lang}\n\t\t\t\t\t\tdata-active={currentLanguage === lang}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (variant === \"minimal\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\t\t\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\t\t\t\thandleChange(availableLanguages[nextIndex]);\n\t\t\t\t}}\n\t\t\t\taria-label={`Current language: ${getLanguageInfo(currentLanguage).name}. Click to change.`}\n\t\t\t>\n\t\t\t\t{formatLanguageDisplay(currentLanguage, display)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<select\n\t\t\tvalue={currentLanguage}\n\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\tclassName={className}\n\t\t\taria-label=\"Select language\"\n\t\t>\n\t\t\t{availableLanguages.map((lang) => (\n\t\t\t\t<option key={lang} value={lang}>\n\t\t\t\t\t{formatLanguageDisplay(lang, display)}\n\t\t\t\t</option>\n\t\t\t))}\n\t\t</select>\n\t);\n}\n","import { useCallback } from \"react\";\nimport { getTranslation, useTranslationStore } from \"../store\";\nimport type { CTFunction, InterpolationValues } from \"../types\";\n\nfunction isInterpolationValues(arg: unknown): arg is InterpolationValues {\n\treturn (\n\t\ttypeof arg === \"object\" &&\n\t\targ !== null &&\n\t\t!Array.isArray(arg) &&\n\t\t!(arg instanceof Date)\n\t);\n}\n\nexport function useCt(): CTFunction {\n\tconst { translations, currentLanguage } = useTranslationStore();\n\n\tconst ct = useCallback(\n\t\t(\n\t\t\ttext: string,\n\t\t\tcontextOrValues?: string | InterpolationValues,\n\t\t\tmaybeValues?: InterpolationValues,\n\t\t): string => {\n\t\t\tlet values: InterpolationValues | undefined;\n\n\t\t\tif (typeof contextOrValues === \"string\") {\n\t\t\t\tvalues = maybeValues;\n\t\t\t} else if (isInterpolationValues(contextOrValues)) {\n\t\t\t\tvalues = contextOrValues;\n\t\t\t}\n\n\t\t\treturn getTranslation(translations, currentLanguage, text, values);\n\t\t},\n\t\t[translations, currentLanguage],\n\t) as CTFunction;\n\n\treturn ct;\n}\n","import React, {\n\tcloneElement,\n\tisValidElement,\n\ttype ReactNode,\n\ttype ReactElement,\n} from \"react\";\nimport { useCt } from \"../hooks/useCt\";\nimport type { InterpolationValues } from \"../types\";\n\nfunction createTagRegex() {\n\treturn /<(\\d+)>(.*?)<\\/\\1>/gs;\n}\n\nexport interface TransProps {\n\tchildren: ReactNode;\n\tcontext?: string;\n\tvalues?: InterpolationValues;\n}\n\ninterface ParsedChild {\n\ttype: \"text\" | \"element\";\n\tcontent: string;\n\telement?: ReactElement;\n\tindex?: number;\n}\n\nfunction parseChildren(children: ReactNode): {\n\ttemplate: string;\n\telements: ReactElement[];\n} {\n\tconst elements: ReactElement[] = [];\n\tlet template = \"\";\n\n\tconst processNode = (node: ReactNode): string => {\n\t\tif (node === null || node === undefined) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (typeof node === \"string\") {\n\t\t\treturn node;\n\t\t}\n\n\t\tif (typeof node === \"number\") {\n\t\t\treturn String(node);\n\t\t}\n\n\t\tif (isValidElement(node)) {\n\t\t\tconst index = elements.length;\n\t\t\telements.push(node);\n\t\t\tconst innerContent = processNode(node.props.children);\n\t\t\treturn `<${index}>${innerContent}</${index}>`;\n\t\t}\n\n\t\tif (Array.isArray(node)) {\n\t\t\treturn node.map(processNode).join(\"\");\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\ttemplate = processNode(children);\n\treturn { template, elements };\n}\n\nfunction reconstructChildren(\n\ttranslated: string,\n\telements: ReactElement[],\n): ReactNode {\n\tif (elements.length === 0) {\n\t\treturn translated;\n\t}\n\n\tconst result: ReactNode[] = [];\n\tlet keyCounter = 0;\n\n\tlet lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\n\tconst tagRegex = createTagRegex();\n\n\twhile ((match = tagRegex.exec(translated)) !== null) {\n\t\t// Add text before the match\n\t\tif (match.index > lastIndex) {\n\t\t\tconst textBefore = translated.slice(lastIndex, match.index);\n\t\t\tif (textBefore) {\n\t\t\t\tresult.push(textBefore);\n\t\t\t}\n\t\t}\n\n\t\tconst elementIndex = parseInt(match[1], 10);\n\t\tconst innerContent = match[2];\n\t\tconst originalElement = elements[elementIndex];\n\n\t\tif (originalElement) {\n\t\t\t// Recursively process inner content in case of nested tags\n\t\t\tconst processedInner = reconstructChildren(innerContent, elements);\n\t\t\tconst cloned = cloneElement(originalElement, {\n\t\t\t\tkey: `trans-${keyCounter++}`,\n\t\t\t\tchildren: processedInner,\n\t\t\t});\n\t\t\tresult.push(cloned);\n\t\t}\n\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\n\t// Add remaining text after last match\n\tif (lastIndex < translated.length) {\n\t\tresult.push(translated.slice(lastIndex));\n\t}\n\n\t// If no matches found, return the original string\n\tif (result.length === 0) {\n\t\treturn translated;\n\t}\n\n\treturn result.length === 1 ? result[0] : result;\n}\n\nexport function Trans({ children, context, values }: TransProps) {\n\tconst ct = useCt();\n\n\t// Parse children to extract template and elements\n\tconst { template, elements } = parseChildren(children);\n\n\t// Translate the template\n\tlet translated: string;\n\tif (context && values) {\n\t\ttranslated = ct(template, context, values);\n\t} else if (context) {\n\t\ttranslated = ct(template, context);\n\t} else if (values) {\n\t\ttranslated = ct(template, values);\n\t} else {\n\t\ttranslated = ct(template);\n\t}\n\n\t// Reconstruct with original elements\n\treturn <>{reconstructChildren(translated, elements)}</>;\n}\n","import { useCallback } from \"react\";\nimport { useTranslationStore } from \"../store\";\nimport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n} from \"../components/LanguageSwitcher\";\n\nexport function useCurrentLanguage(): string {\n\treturn useTranslationStore((state) => state.currentLanguage);\n}\n\nexport function useSetLanguage(): (language: string) => void {\n\treturn useTranslationStore((state) => state.setLanguage);\n}\n\nexport function useAvailableLanguages(): string[] {\n\treturn useTranslationStore((state) => state.availableLanguages);\n}\n\nexport function useIsLoading(): boolean {\n\treturn useTranslationStore((state) => state.isLoading);\n}\n\nexport function useIsReady(): boolean {\n\treturn useTranslationStore((state) => state.isReady);\n}\n\nexport function useLanguageInfo(code?: string): LanguageInfo {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst targetCode = code ?? currentLanguage;\n\treturn getFullLanguageInfo(targetCode);\n}\n\nexport function useAvailableLanguagesInfo(): LanguageInfo[] {\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\treturn availableLanguages.map(getFullLanguageInfo);\n}\n\nexport function useLanguage() {\n\tconst currentLanguage = useTranslationStore((state) => state.currentLanguage);\n\tconst availableLanguages = useTranslationStore(\n\t\t(state) => state.availableLanguages,\n\t);\n\tconst setLanguage = useTranslationStore((state) => state.setLanguage);\n\tconst isLoading = useTranslationStore((state) => state.isLoading);\n\tconst isReady = useTranslationStore((state) => state.isReady);\n\n\tconst currentLanguageInfo = getFullLanguageInfo(currentLanguage);\n\tconst availableLanguagesInfo = availableLanguages.map(getFullLanguageInfo);\n\n\tconst cycleLanguage = useCallback(() => {\n\t\tif (availableLanguages.length === 0) {\n\t\t\tconsole.warn(\"[ciao-tools] Cannot cycle language: no languages available\");\n\t\t\treturn;\n\t\t}\n\t\tif (availableLanguages.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentIndex = availableLanguages.indexOf(currentLanguage);\n\t\tconst nextIndex = (currentIndex + 1) % availableLanguages.length;\n\t\tsetLanguage(availableLanguages[nextIndex]);\n\t}, [availableLanguages, currentLanguage, setLanguage]);\n\n\treturn {\n\t\tcurrentLanguage,\n\t\tcurrentLanguageInfo,\n\t\tavailableLanguages,\n\t\tavailableLanguagesInfo,\n\t\tsetLanguage,\n\t\tcycleLanguage,\n\t\tisLoading,\n\t\tisReady,\n\t};\n}\n\nexport function getCiaoLanguage(): string {\n\treturn useTranslationStore.getState().currentLanguage;\n}\n\nexport interface CiaoHeaders {\n\t\"X-Ciao-Language\": string;\n\t\"Accept-Language\": string;\n}\n\nexport function getCiaoHeaders(): CiaoHeaders {\n\tconst currentLanguage = useTranslationStore.getState().currentLanguage;\n\tconst defaultLanguage = useTranslationStore.getState().defaultLanguage;\n\n\tlet acceptLanguage = currentLanguage;\n\tif (defaultLanguage && defaultLanguage !== currentLanguage) {\n\t\tacceptLanguage = `${currentLanguage}, ${defaultLanguage};q=0.9, *;q=0.5`;\n\t}\n\n\treturn {\n\t\t\"X-Ciao-Language\": currentLanguage,\n\t\t\"Accept-Language\": acceptLanguage,\n\t};\n}\n\nexport function ciaoFetch(\n\tinput: RequestInfo | URL,\n\tinit?: RequestInit,\n): Promise<Response> {\n\tconst headers = getCiaoHeaders();\n\tconst mergedHeaders = new Headers(init?.headers);\n\n\tif (!mergedHeaders.has(\"X-Ciao-Language\")) {\n\t\tmergedHeaders.set(\"X-Ciao-Language\", headers[\"X-Ciao-Language\"]);\n\t}\n\tif (!mergedHeaders.has(\"Accept-Language\")) {\n\t\tmergedHeaders.set(\"Accept-Language\", headers[\"Accept-Language\"]);\n\t}\n\n\treturn fetch(input, {\n\t\t...init,\n\t\theaders: mergedHeaders,\n\t});\n}\n\nexport {\n\tgetLanguageInfo,\n\tgetFullLanguageInfo,\n\tLANGUAGE_DATA,\n\ttype LanguageInfo,\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "experimental-ciao-react",
3
- "version": "1.1.16",
3
+ "version": "1.1.17",
4
4
  "type": "module",
5
5
  "description": "React components and hooks for ciao-tools - runtime translation support",
6
6
  "main": "./dist/index.cjs",