UNPKG

@pap-it/tools-translator

Version:
2 lines (1 loc) 3.59 kB
"use strict";import{debounce as c}from"@pap-it/system-utils";export const TRANSLATION_CHANGE_EVENTNAME="pap-translation-change",TRANSLATION_ADDED="pap-translation-added";export function load(n){add(n),change(n.id)}function p(n){n.translations?.meta?n.meta=n.translations.meta:n.meta||(n.meta={language:n.id,region:n.id}),window.papLocalization.map.set(n.id,n)}export function add(n){p(n),window.dispatchEvent(new Event(TRANSLATION_ADDED))}export function addAll(n){n.forEach(p),window.dispatchEvent(new Event(TRANSLATION_ADDED))}export async function change(n){let t=window.papLocalization.map.get(n);if(!t){for(const a of window.papLocalization.map.values())if(a.meta&&(a.meta.language===n||a.meta.region===n)){t=a;break}if(!t)return console.warn(`[ERROR] could not find the provided translation ${n}`),window.localStorage.removeItem("pap-translation"),!1}if(t.id===window.papLocalization.current.id)return!0;if(!t.translations&&t.url)try{const e=await(await fetch(t.url)).json();t.translations=e,p(t)}catch(a){return window.papLocalization.map.delete(t.id),window.localStorage.removeItem("pap-translation"),console.error("[error] could not fetch translation",a),!1}let o=window.papLocalization.current?.meta?.language;window.papLocalization.current=t,window.localStorage.setItem("pap-translation",t.id);const i=window.papLocalization.current.meta.language;if(document.head.setAttribute("lang",i),window.papLocalization.setURL){const a=window.location.pathname.split("/").filter(l=>l.length>0),e=a[0];if(e===i)return window.dispatchEvent(new Event(TRANSLATION_CHANGE_EVENTNAME)),!0;if(a.length>0){if(o===a[0])a[0]=i;else if(window.papLocalization.intl){const l=window.papLocalization.intl.of(a[0]);(l||l!==a[0])&&(a[0]=i)}}e===a[0]&&a.unshift(i);let r="/"+a.join("/");r==="/"+i&&(r+="/"),history.pushState(null,"",r)}return window.dispatchEvent(new Event(TRANSLATION_CHANGE_EVENTNAME)),!0}export function subscribe(n){window.addEventListener(TRANSLATION_CHANGE_EVENTNAME,n)}export function unsubscribe(n){window.removeEventListener(TRANSLATION_CHANGE_EVENTNAME,n)}export function detect(){if(window.papLocalization?.current?.meta)return window.papLocalization.current.meta.language;if(window.papLocalization.setURL){const i=window.location.pathname.match(/\/([^/]+)/);if(i)if(window.papLocalization.intl){const a=window.papLocalization.intl.of(i[1]);if(a||a!==i[1])return i[1]}else return i[1]}const n=window.localStorage.getItem("pap-translation");if(n)return n;const t=document.head.getAttribute("lang");if(t)return t;const o=navigator.language;if(o)return o}export function init(n,t){(!window.papLocalization||!window.papLocalization.subscribe)&&(window.papLocalization={load,change,add,addAll,subscribe,unsubscribe,detect,setURL:window.papLocalization?.setURL===void 0?!0:window.papLocalization?.setURL,current:{},map:new Map},"DisplayNames"in Intl?window.papLocalization.intl=window.papLocalization.intl||new Intl.DisplayNames(["en"],{type:"language"}):console.warn("Intl.DisplayNames is NOT supported in this browser."),window.addEventListener(TRANSLATION_ADDED,c(async()=>{if(window.papLocalization.map.size>0&&window.papLocalization.current?.id===void 0){const o=window.papLocalization.detect();if(o){let i=await window.papLocalization.change(o);if(!i){for(const a of window.papLocalization.map.keys())if(i=await window.papLocalization.change(a),i)break;i||console.error("[ERROR]: could not change to any available languages")}}else console.warn("[WARN]: could not detect any target language")}},1e3))),n&&(window.papLocalization.addAll(n),t&&window.papLocalization.change(t))}