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