@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 1.65 kB
JavaScript
import n from"i18next";import{observable as u}from"mobx";import{LANGUAGE_TYPE as y}from"../constants";import p from"../locales";import S from"../tools/base-runtime-url";import{loadJson as w}from"../tools/loaders";import{isLocalStorageAvailable as i}from"./localStorage";const l="en",s="efp-locale",g="language",c=u.box(l),m=u.array([],{deep:!1}),f=o=>w(`${S}locales/${o}.json`),v=()=>{if(!i)return null;const o=localStorage.getItem(s),e=localStorage.getItem(g);return e&&localStorage.removeItem(g),o||(e&&localStorage.setItem(s,e),e)},d=()=>{const o=window.__data,e=navigator.languages?.[0]||navigator.language,a=Object.keys(p).find(r=>e.startsWith(r));return(v()||o?.locale||a||l).toLowerCase()};export const getLocale=()=>c.get(),getLocales=()=>m,hasLocale=o=>m.some(e=>e.id===o),t=(o,e)=>(c.get(),n.t(o,e)),initI18n=async()=>{m.replace(Object.entries(p).sort(([a],[r])=>a.localeCompare(r)).map(([a,r])=>({id:a,name:r,entity:{type:y}})));let o=d();const e={};if(o!==l)try{e[o]={translation:await f(o)}}catch(a){console.error(`Unable to load "${o}" localization, falling back to "${l}".`,a),o=l}return c.set(o),n.init({resources:e,lng:o,keySeparator:!1,saveMissing:o!==l,missingKeyHandler:(a,r,L,b)=>console.debug(`i18n missing key: '${a[0]}:${r}:${L}', fallback: '${b}'`)})},setLocale=async o=>{const e=o.toLowerCase();try{e!==l&&!n.hasResourceBundle(e,"translation")&&n.addResourceBundle(e,"translation",await f(e),!0,!0),await n.changeLanguage(e),c.set(e),i&&localStorage.setItem(s,e)}catch(a){console.error(`Failed to switch language to "${e}":`,a)}},resetLocale=async()=>(i&&(localStorage.removeItem(s),localStorage.removeItem(g)),setLocale(d()));