import { textes, getLanguage } from './kernel'
let lastLanguage, wasForEditor
/**
* Initialise les textes (exportés par kernel), appelé par le loader
* La promesse retournée sera résolue quand toutes les polices en cours de chargement
* (y compris l'arabe éventuellement déclenché par cet appel) seront chargées
* @param {string} language
* @param {boolean} isForEditor
* @returns {Promise<undefined>}
*/
async function loadTextes (language, isForEditor) {
const lang = language || getLanguage()
// attention, si on a déjà été appelé pour le player et qu'on est rappelé pour l'éditeur faut charger ce qu'il manque
if (lang === lastLanguage && (wasForEditor || !isForEditor)) {
// on nous demande la dernière langue chargée, c'est déjà fait
return
}
/* Lignes suivantes supprimées car, en ligne, on peut choisir de changer de langue dans la version application
if (lastLanguage && wasForEditor) {
console.warn(Error(`Language ${lang} will override ${lastLanguage} previously loaded for all mathgraph instances of this page`))
}
*/
let promises
// si on a déjà chargé les textes de l'éditeur, faut le refaire quoi qu'il arrive,
// sinon on pourrait avoir les textes de l'éditeur dans une langue et ceux du player dans une autre
if (wasForEditor) {
isForEditor = true
} else {
wasForEditor = isForEditor
}
if (lang === 'fr') {
promises = [import('../textes/textesFr.js')]
if (isForEditor) promises.push(import('../textes/textesFrAdd.js'))
} else if (lang === 'de') {
promises = [import('../textes/textesDe.js')]
if (isForEditor) promises.push(import('../textes/textesDeAdd.js'))
} else if (lang === 'es') {
promises = [import('../textes/textesEs.js')]
if (isForEditor) promises.push(import('../textes/textesEsAdd.js'))
} else if (lang === 'ar') {
promises = [import('../textes/textesAr.js')]
// pour l'arabe il faut charger cette police car roboto ne contient pas tous les caractères
// on ne l'ajoute pas à promises que ne doit contenir que des promesses résolues
// avec des textes
await import('@fontsource/noto-sans-arabic')
if (isForEditor) promises.push(import('../textes/textesArAdd.js'))
} else {
promises = [import('../textes/textesEn.js')]
if (isForEditor) promises.push(import('../textes/textesEnAdd.js'))
}
// on ajoute les textes chargés à l'objet textes du kernel
const esModules = await Promise.all(promises)
// on ajoute les textes dans l'ordre du tableau, donc le add en dernier
for (const esModule of esModules) {
Object.assign(textes, esModule.default)
}
lastLanguage = lang
// et on attend que les fichiers de polices soient effectivement chargés
// (pas seulement les css qui déclarent les @font-face)
// https://developer.mozilla.org/en-US/docs/Web/API/Document/fonts
// https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/ready
await document.fonts.ready
// on ne fait pas de `return document.fonts.ready` car ça retournerait une promesse résolue avec un FontFaceSet
}
export default loadTextes