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 94 95 96 97 98 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 9x 2x 2x 9x 1x 1x 1x 1x 6x 9x 9x 2x 2x 4x 4x 1x 1x 1x 1x 1x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 2x 2x 2x 2x 2x 7x 7x 9x 9x 5x 5x 9x 2x 2x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
 * This JS API is to allow I18n on canvas elements because all the logic goes to JS
 */
import { getStoresInfoFromElement, setStoreFromElement, isStoreSetOnElement } from '../utils/store-map/store-map.js'
import { queryFromTranslations } from '../utils/translation-query/translation-query.util.js'
import { getLanguageFromElement } from '../utils/algorithms/get-lang-from-element.util.js'
import { loadI18n } from '../html-loader/html-loader.js'
 
/**
 * Translates i18n key
 * @param {string} key - target key
 * @param {Context} [context] - context for translations
 * @returns {Promise<string>} future translated key
 */
export async function translate (key, context) {
  if (!context) {
    return await i18nFromBrowserLanguage(key)
  }
  if ('element' in context && context.element) {
    const { locale, element } = context
    const localeStr = locale || getLanguageFromElement(element)
    return await i18nFromElementAndLocale(key, element, localeStr)
  }
  const { locale } = context
  const localeStr = locale || getLanguageFromElement(document.documentElement)
  if ('store' in context && context.store) {
    return await i18nFromStoreAndLocale(key, context.store, localeStr)
  }
  return await i18nFromElementAndLocale(key, document.documentElement, localeStr)
}
 
/**
 * @param {string} key - target key
 * @returns {Promise<string>} future translated key
 */
async function i18nFromBrowserLanguage (key) {
  return await i18nFromElementAndLocale(key, document.documentElement, getLanguageFromElement(document.documentElement))
}
 
/**
 *
 * @param {string} key - target key
 * @param {Element} element - target element
 * @param {string | Intl.Locale} localeString - target language to translate
 * @returns {Promise<string>} future translated key
 */
async function i18nFromElementAndLocale (key, element, localeString) {
  const locale = new Intl.Locale(localeString)
  if (element?.ownerDocument?.documentElement && !isStoreSetOnElement(element.ownerDocument.documentElement)) {
    const window = document.defaultView
    if (!window) { return key }
    const store = await loadI18n(window)
    setStoreFromElement(document.documentElement, store)
  }
 
  for (const storeInfo of getStoresInfoFromElement(element)) {
    const result = queryFromTranslations(key, await storeInfo.store.translationsFromLanguage(locale))
    if (result.found) {
      return result.translate(locale)
    }
  }
  return key
}
 
/**
 * @param {string} key - target key
 * @param {import("../utils/store/translation-store.js").TranslationStore} store - target store
 * @param {string | Intl.Locale} localeString - target language to translate
 * @returns {Promise<string>} future translated key
 */
async function i18nFromStoreAndLocale (key, store, localeString) {
  const locale = new Intl.Locale(localeString)
  const result = queryFromTranslations(key, await store.translationsFromLanguage(locale))
  return result.found ? result.translate(locale) : key
}
 
/** @typedef {DOMContext| StoreContext | LocaleContext} Context */
 
/**
 * @typedef {object} DOMContext
 * Translate based on information of an DOM element
 * @property {Element} element - target element
 * @property {string | Intl.Locale} [locale] - target language to translate, finds the language from element if not defined
 */
 
/**
 * @typedef {object} StoreContext
 * Translate based on a store
 * @property {import("../utils/store/translation-store.js").TranslationStore} store - target store
 * @property {string | Intl.Locale} [locale] - target language to translate, finds the language from DOM document if not defined
 */
 
/**
 * @typedef {object} LocaleContext
 * Translate based on initially loaded i8n data in the window
 * @property {string | Intl.Locale} [locale] - target language to translate, finds the language from DOM document if not defined
 */
  |