'use strict'; var store = require('svelte/store'); var deepmerge = require('deepmerge'); var intlMessageformat = require('intl-messageformat'); function delve(obj, fullKey) { if (fullKey == null) return void 0; if (fullKey in obj) { return obj[fullKey]; } const keys = fullKey.split("."); let result = obj; for (let p = 0; p < keys.length; p++) { if (typeof result === "object") { if (p > 0) { const partialKey = keys.slice(p, keys.length).join("."); if (partialKey in result) { result = result[partialKey]; break; } } result = result[keys[p]]; } else { result = void 0; } } return result; } const lookupCache = {}; const addToCache = (path, locale, message) => { if (!message) return message; if (!(locale in lookupCache)) lookupCache[locale] = {}; if (!(path in lookupCache[locale])) lookupCache[locale][path] = message; return message; }; const lookup = (path, refLocale) => { if (refLocale == null) return void 0; if (refLocale in lookupCache && path in lookupCache[refLocale]) { return lookupCache[refLocale][path]; } const locales = getPossibleLocales(refLocale); for (let i = 0; i < locales.length; i++) { const locale = locales[i]; const message = getMessageFromDictionary(locale, path); if (message) { return addToCache(path, refLocale, message); } } return void 0; }; let dictionary; const $dictionary = store.writable({}); function getLocaleDictionary(locale) { return dictionary[locale] || null; } function hasLocaleDictionary(locale) { return locale in dictionary; } function getMessageFromDictionary(locale, id) { if (!hasLocaleDictionary(locale)) { return null; } const localeDictionary = getLocaleDictionary(locale); const match = delve(localeDictionary, id); return match; } function getClosestAvailableLocale(refLocale) { if (refLocale == null) return void 0; const relatedLocales = getPossibleLocales(refLocale); for (let i = 0; i < relatedLocales.length; i++) { const locale = relatedLocales[i]; if (hasLocaleDictionary(locale)) { return locale; } } return void 0; } function addMessages(locale, ...partials) { delete lookupCache[locale]; $dictionary.update((d) => { d[locale] = deepmerge.all([d[locale] || {}, ...partials]); return d; }); } const $locales = store.derived( [$dictionary], ([dictionary2]) => Object.keys(dictionary2) ); $dictionary.subscribe((newDictionary) => dictionary = newDictionary); const queue = {}; function createLocaleQueue(locale) { queue[locale] = /* @__PURE__ */ new Set(); } function removeLoaderFromQueue(locale, loader) { queue[locale].delete(loader); if (queue[locale].size === 0) { delete queue[locale]; } } function getLocaleQueue(locale) { return queue[locale]; } function getLocalesQueues(locale) { return getPossibleLocales(locale).map((localeItem) => { const localeQueue = getLocaleQueue(localeItem); return [localeItem, localeQueue ? [...localeQueue] : []]; }).filter(([, localeQueue]) => localeQueue.length > 0); } function hasLocaleQueue(locale) { if (locale == null) return false; return getPossibleLocales(locale).some( (localeQueue) => { var _a; return (_a = getLocaleQueue(localeQueue)) == null ? void 0 : _a.size; } ); } function loadLocaleQueue(locale, localeQueue) { const allLoadersPromise = Promise.all( localeQueue.map((loader) => { removeLoaderFromQueue(locale, loader); return loader().then((partial) => partial.default || partial); }) ); return allLoadersPromise.then((partials) => addMessages(locale, ...partials)); } const activeFlushes = {}; function flush(locale) { if (!hasLocaleQueue(locale)) { if (locale in activeFlushes) { return activeFlushes[locale]; } return Promise.resolve(); } const queues = getLocalesQueues(locale); activeFlushes[locale] = Promise.all( queues.map( ([localeName, localeQueue]) => loadLocaleQueue(localeName, localeQueue) ) ).then(() => { if (hasLocaleQueue(locale)) { return flush(locale); } delete activeFlushes[locale]; }); return activeFlushes[locale]; } function registerLocaleLoader(locale, loader) { if (!getLocaleQueue(locale)) createLocaleQueue(locale); const localeQueue = getLocaleQueue(locale); if (getLocaleQueue(locale).has(loader)) return; if (!hasLocaleDictionary(locale)) { $dictionary.update((d) => { d[locale] = {}; return d; }); } localeQueue.add(loader); } var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols; var __hasOwnProp$2 = Object.prototype.hasOwnProperty; var __propIsEnum$2 = Object.prototype.propertyIsEnumerable; var __objRest$1 = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$2) for (var prop of __getOwnPropSymbols$2(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop)) target[prop] = source[prop]; } return target; }; const defaultFormats = { number: { scientific: { notation: "scientific" }, engineering: { notation: "engineering" }, compactLong: { notation: "compact", compactDisplay: "long" }, compactShort: { notation: "compact", compactDisplay: "short" } }, date: { short: { month: "numeric", day: "numeric", year: "2-digit" }, medium: { month: "short", day: "numeric", year: "numeric" }, long: { month: "long", day: "numeric", year: "numeric" }, full: { weekday: "long", month: "long", day: "numeric", year: "numeric" } }, time: { short: { hour: "numeric", minute: "numeric" }, medium: { hour: "numeric", minute: "numeric", second: "numeric" }, long: { hour: "numeric", minute: "numeric", second: "numeric", timeZoneName: "short" }, full: { hour: "numeric", minute: "numeric", second: "numeric", timeZoneName: "short" } } }; function defaultMissingKeyHandler({ locale, id }) { console.warn( `[svelte-i18n] The message "${id}" was not found in "${getPossibleLocales( locale ).join('", "')}".${hasLocaleQueue(getCurrentLocale()) ? ` Note: there are at least one loader still registered to this locale that wasn't executed.` : ""}` ); } const defaultOptions = { fallbackLocale: null, loadingDelay: 200, formats: defaultFormats, warnOnMissingMessages: true, handleMissingMessage: void 0, ignoreTag: true }; const options = defaultOptions; function getOptions() { return options; } function init(opts) { const _a = opts, { formats } = _a, rest = __objRest$1(_a, ["formats"]); let initialLocale = opts.fallbackLocale; if (opts.initialLocale) { try { if (intlMessageformat.IntlMessageFormat.resolveLocale(opts.initialLocale)) { initialLocale = opts.initialLocale; } } catch (e) { console.warn( `[svelte-i18n] The initial locale "${opts.initialLocale}" is not a valid locale.` ); } } if (rest.warnOnMissingMessages) { delete rest.warnOnMissingMessages; if (rest.handleMissingMessage == null) { rest.handleMissingMessage = defaultMissingKeyHandler; } else { console.warn( '[svelte-i18n] The "warnOnMissingMessages" option is deprecated. Please use the "handleMissingMessage" option instead.' ); } } Object.assign(options, rest, { initialLocale }); if (formats) { if ("number" in formats) { Object.assign(options.formats.number, formats.number); } if ("date" in formats) { Object.assign(options.formats.date, formats.date); } if ("time" in formats) { Object.assign(options.formats.time, formats.time); } } return $locale.set(initialLocale); } const $isLoading = store.writable(false); var __defProp$1 = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols; var __hasOwnProp$1 = Object.prototype.hasOwnProperty; var __propIsEnum$1 = Object.prototype.propertyIsEnumerable; var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$1 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]); if (__getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(b)) { if (__propIsEnum$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); let current; const internalLocale = store.writable(null); function getSubLocales(refLocale) { return refLocale.split("-").map((_, i, arr) => arr.slice(0, i + 1).join("-")).reverse(); } function getPossibleLocales(refLocale, fallbackLocale = getOptions().fallbackLocale) { const locales = getSubLocales(refLocale); if (fallbackLocale) { return [.../* @__PURE__ */ new Set([...locales, ...getSubLocales(fallbackLocale)])]; } return locales; } function getCurrentLocale() { return current != null ? current : void 0; } internalLocale.subscribe((newLocale) => { current = newLocale != null ? newLocale : void 0; if (typeof window !== "undefined" && newLocale != null) { document.documentElement.setAttribute("lang", newLocale); } }); const set = (newLocale) => { if (newLocale && getClosestAvailableLocale(newLocale) && hasLocaleQueue(newLocale)) { const { loadingDelay } = getOptions(); let loadingTimer; if (typeof window !== "undefined" && getCurrentLocale() != null && loadingDelay) { loadingTimer = window.setTimeout( () => $isLoading.set(true), loadingDelay ); } else { $isLoading.set(true); } return flush(newLocale).then(() => { internalLocale.set(newLocale); }).finally(() => { clearTimeout(loadingTimer); $isLoading.set(false); }); } return internalLocale.set(newLocale); }; const $locale = __spreadProps(__spreadValues$1({}, internalLocale), { set }); const getFromQueryString = (queryString, key) => { const keyVal = queryString.split("&").find((i) => i.indexOf(`${key}=`) === 0); if (keyVal) { return keyVal.split("=").pop(); } return null; }; const getFirstMatch = (base, pattern) => { const match = pattern.exec(base); if (!match) return null; return match[1] || null; }; const getLocaleFromHostname = (hostname) => { if (typeof window === "undefined") return null; return getFirstMatch(window.location.hostname, hostname); }; const getLocaleFromPathname = (pathname) => { if (typeof window === "undefined") return null; return getFirstMatch(window.location.pathname, pathname); }; const getLocaleFromNavigator = () => { if (typeof window === "undefined") return null; return window.navigator.language || window.navigator.languages[0]; }; const getLocaleFromQueryString = (search) => { if (typeof window === "undefined") return null; return getFromQueryString(window.location.search.substr(1), search); }; const getLocaleFromHash = (hash) => { if (typeof window === "undefined") return null; return getFromQueryString(window.location.hash.substr(1), hash); }; const monadicMemoize = (fn) => { const cache = /* @__PURE__ */ Object.create(null); const memoizedFn = (arg) => { const cacheKey = JSON.stringify(arg); if (cacheKey in cache) { return cache[cacheKey]; } return cache[cacheKey] = fn(arg); }; return memoizedFn; }; var __defProp = Object.defineProperty; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __objRest = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols) for (var prop of __getOwnPropSymbols(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) target[prop] = source[prop]; } return target; }; const getIntlFormatterOptions = (type, name) => { const { formats } = getOptions(); if (type in formats && name in formats[type]) { return formats[type][name]; } throw new Error(`[svelte-i18n] Unknown "${name}" ${type} format.`); }; const createNumberFormatter = monadicMemoize( (_a) => { var _b = _a, { locale, format } = _b, options = __objRest(_b, ["locale", "format"]); if (locale == null) { throw new Error('[svelte-i18n] A "locale" must be set to format numbers'); } if (format) { options = getIntlFormatterOptions("number", format); } return new Intl.NumberFormat(locale, options); } ); const createDateFormatter = monadicMemoize( (_c) => { var _d = _c, { locale, format } = _d, options = __objRest(_d, ["locale", "format"]); if (locale == null) { throw new Error('[svelte-i18n] A "locale" must be set to format dates'); } if (format) { options = getIntlFormatterOptions("date", format); } else if (Object.keys(options).length === 0) { options = getIntlFormatterOptions("date", "short"); } return new Intl.DateTimeFormat(locale, options); } ); const createTimeFormatter = monadicMemoize( (_e) => { var _f = _e, { locale, format } = _f, options = __objRest(_f, ["locale", "format"]); if (locale == null) { throw new Error( '[svelte-i18n] A "locale" must be set to format time values' ); } if (format) { options = getIntlFormatterOptions("time", format); } else if (Object.keys(options).length === 0) { options = getIntlFormatterOptions("time", "short"); } return new Intl.DateTimeFormat(locale, options); } ); const getNumberFormatter = (_g = {}) => { var _h = _g, { locale = getCurrentLocale() } = _h, args = __objRest(_h, [ "locale" ]); return createNumberFormatter(__spreadValues({ locale }, args)); }; const getDateFormatter = (_i = {}) => { var _j = _i, { locale = getCurrentLocale() } = _j, args = __objRest(_j, [ "locale" ]); return createDateFormatter(__spreadValues({ locale }, args)); }; const getTimeFormatter = (_k = {}) => { var _l = _k, { locale = getCurrentLocale() } = _l, args = __objRest(_l, [ "locale" ]); return createTimeFormatter(__spreadValues({ locale }, args)); }; const getMessageFormatter = monadicMemoize( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion (message, locale = getCurrentLocale()) => new intlMessageformat.IntlMessageFormat(message, locale, getOptions().formats, { ignoreTag: getOptions().ignoreTag }) ); const formatMessage = (id, options = {}) => { var _a, _b, _c, _d; let messageObj = options; if (typeof id === "object") { messageObj = id; id = messageObj.id; } const { values, locale = getCurrentLocale(), default: defaultValue } = messageObj; if (locale == null) { throw new Error( "[svelte-i18n] Cannot format a message without first setting the initial locale." ); } let message = lookup(id, locale); if (!message) { message = (_d = (_c = (_b = (_a = getOptions()).handleMissingMessage) == null ? void 0 : _b.call(_a, { locale, id, defaultValue })) != null ? _c : defaultValue) != null ? _d : id; } else if (typeof message !== "string") { console.warn( `[svelte-i18n] Message with id "${id}" must be of type "string", found: "${typeof message}". Gettin its value through the "$format" method is deprecated; use the "json" method instead.` ); return message; } if (!values) { return message; } let result = message; try { result = getMessageFormatter(message, locale).format(values); } catch (e) { if (e instanceof Error) { console.warn( `[svelte-i18n] Message "${id}" has syntax error:`, e.message ); } } return result; }; const formatTime = (t, options) => { return getTimeFormatter(options).format(t); }; const formatDate = (d, options) => { return getDateFormatter(options).format(d); }; const formatNumber = (n, options) => { return getNumberFormatter(options).format(n); }; const getJSON = (id, locale = getCurrentLocale()) => { return lookup(id, locale); }; const $format = store.derived([$locale, $dictionary], () => formatMessage); const $formatTime = store.derived([$locale], () => formatTime); const $formatDate = store.derived([$locale], () => formatDate); const $formatNumber = store.derived([$locale], () => formatNumber); const $getJSON = store.derived([$locale, $dictionary], () => getJSON); function unwrapFunctionStore(store) { let localReference; const cancel = store.subscribe((value) => localReference = value); const fn = (...args) => localReference(...args); fn.freeze = cancel; return fn; } function defineMessages(i) { return i; } function waitLocale(locale) { return flush(locale || getCurrentLocale() || getOptions().initialLocale); } exports._ = $format; exports.addMessages = addMessages; exports.date = $formatDate; exports.defineMessages = defineMessages; exports.dictionary = $dictionary; exports.format = $format; exports.getDateFormatter = getDateFormatter; exports.getLocaleFromHash = getLocaleFromHash; exports.getLocaleFromHostname = getLocaleFromHostname; exports.getLocaleFromNavigator = getLocaleFromNavigator; exports.getLocaleFromPathname = getLocaleFromPathname; exports.getLocaleFromQueryString = getLocaleFromQueryString; exports.getMessageFormatter = getMessageFormatter; exports.getNumberFormatter = getNumberFormatter; exports.getTimeFormatter = getTimeFormatter; exports.init = init; exports.isLoading = $isLoading; exports.json = $getJSON; exports.locale = $locale; exports.locales = $locales; exports.number = $formatNumber; exports.register = registerLocaleLoader; exports.t = $format; exports.time = $formatTime; exports.unwrapFunctionStore = unwrapFunctionStore; exports.waitLocale = waitLocale;