Spaces:
Runtime error
Runtime error
| ; | |
| 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; | |