Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 1x 1x | import { importDefinitionMap } from '../utils/i18n-importer/i18n-importer.js' import { i18nTranslationStore } from '../utils/store/translation-store.js' import { builder } from '../utils/i18n-merger/i18n-merger.util.js' /** * Adds locale maps to mergeInstance * @param {object} params - parameters * @param {Document} params.document - DOM document * @param {BaseURL} params.location - i18n locale map location * @param {typeof builder} params.merger - merge instance * @returns {Promise<typeof builder>} resulting mergeInstance */ async function loadLocaleMaps ({ document, location, merger }) { const locationHref = location.href const localeMaps = Array.from(document.querySelectorAll('link[rel="i18n-locale-map"]')) if (localeMaps.length <= 0) { return merger } const deferredMapPromises = localeMaps.flatMap((link) => { const href = link.getAttribute('href') if (!href) return [] return [importDefinitionMap(href, locationHref).then((result) => ({ result, location: new URL(href, locationHref) }))] }) const promiseResults = await Promise.allSettled(deferredMapPromises) return promiseResults.reduce((merger, settled) => { if (settled.status === 'rejected') { console.error('error loading file: %o', settled.reason) return merger } const { result, location } = settled.value return merger.addMap(result, location) }, merger) } /** * Adds translations to mergeInstance * @param {object} params - parameters * @param {Document} params.document - DOM document * @param {BaseURL} params.location - i18n translation location * @param {typeof builder} params.merger - merge instance * @returns {typeof builder} - resulting mergeInstance */ function loadTranslations ({ document, location, merger }) { const locationHref = location.href const translationsMaps = document.querySelectorAll('link[rel="i18n-translation-map"]') if (translationsMaps.length <= 0) { return merger } return [...translationsMaps].reduce((merger, link) => { const href = link.getAttribute('href') const lang = link.getAttribute('lang') if (href == null) { console.error('link %o requires a href attribute, it will be ignored', link) return merger } if (lang == null) { console.error('link %o requires a lang attribute, it will be ignored', link) return merger } try { const locale = new Intl.Locale(lang) return merger.addTranslations(new URL(href, locationHref), locale) } catch { console.error(`invalid locale "${lang}", it will be ignored`) } return merger }, merger) } /** * Loads i18n from the DOM * @param {object} params - loadI18n parameters * @param {Document} params.document - DOM document * @param {BaseURL | string} params.location - i18n location * @returns {Promise<import('../utils/store/translation-store.js').TranslationStore>} - loaded store */ export async function loadI18n ({ document, location } = window) { location = typeof location === 'string' ? new URL(location) : location const localeMapMerger = await loadLocaleMaps({ document, location, merger: builder }) const finalMerger = loadTranslations({ document, location, merger: localeMapMerger }) const store = i18nTranslationStore() store.loadTranslations({ location: location.href, languages: finalMerger.build(), }) return store } /** @typedef {{href: string}} BaseURL - any type that has `href`, like {@link URL} and {@link window.location} */ |