@hkonda/loco-translate 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/loco.js +33 -3
- package/public/loco.min.js +2 -2
- package/versions.json +1 -1
package/package.json
CHANGED
package/public/loco.js
CHANGED
|
@@ -1120,11 +1120,13 @@ var Loco = function() {
|
|
|
1120
1120
|
if (!yieldEvery) yieldEvery = 100;
|
|
1121
1121
|
var applied = 0;
|
|
1122
1122
|
var skipped = 0;
|
|
1123
|
+
var frameStart = performance.now();
|
|
1123
1124
|
for (var i = 0; i < phrases.length; i += yieldEvery) {
|
|
1124
|
-
if (i > 0) {
|
|
1125
|
+
if (i > 0 && performance.now() - frameStart > 16) {
|
|
1125
1126
|
await new Promise(function(resolve) {
|
|
1126
|
-
|
|
1127
|
+
requestAnimationFrame(resolve);
|
|
1127
1128
|
});
|
|
1129
|
+
frameStart = performance.now();
|
|
1128
1130
|
}
|
|
1129
1131
|
var batch = phrases.slice(i, i + yieldEvery);
|
|
1130
1132
|
var result = applyTranslations(batch, translations);
|
|
@@ -1963,7 +1965,7 @@ var Loco = function() {
|
|
|
1963
1965
|
var Loco2 = {
|
|
1964
1966
|
// Version is injected by Vite at build time from versions.json.
|
|
1965
1967
|
// In-browser: Loco.version → e.g. "1.0.8"
|
|
1966
|
-
version: "1.0.
|
|
1968
|
+
version: "1.0.10",
|
|
1967
1969
|
init: function(config) {
|
|
1968
1970
|
if (!config) {
|
|
1969
1971
|
console.warn("[loco] Loco.init() requires a config object");
|
|
@@ -2008,6 +2010,12 @@ var Loco = function() {
|
|
|
2008
2010
|
}
|
|
2009
2011
|
},
|
|
2010
2012
|
apply: async function(langCode) {
|
|
2013
|
+
var _perf = typeof window !== "undefined" && window.__locoPerfMode;
|
|
2014
|
+
if (_perf) {
|
|
2015
|
+
performance.clearMarks();
|
|
2016
|
+
performance.clearMeasures();
|
|
2017
|
+
performance.mark("loco-apply-start");
|
|
2018
|
+
}
|
|
2011
2019
|
if (!langCode) {
|
|
2012
2020
|
console.warn('[loco] Loco.apply() requires a language code, e.g. Loco.apply("zh-Hans")');
|
|
2013
2021
|
return;
|
|
@@ -2046,10 +2054,21 @@ var Loco = function() {
|
|
|
2046
2054
|
untranslate(state.phrases);
|
|
2047
2055
|
state.translations = normalizeTranslationMap(state.fileData.translations[langCode]);
|
|
2048
2056
|
state.fileData.translations[langCode] = state.translations;
|
|
2057
|
+
if (_perf) performance.mark("loco-collect-start");
|
|
2049
2058
|
state.phrases = await collectPhrasesAsync(document.body);
|
|
2059
|
+
if (_perf) {
|
|
2060
|
+
performance.mark("loco-collect-end");
|
|
2061
|
+
performance.measure("loco-collection-time", "loco-collect-start", "loco-collect-end");
|
|
2062
|
+
}
|
|
2050
2063
|
var allTransKeys = Object.keys(state.translations);
|
|
2051
2064
|
buildFileVarKeyMap(state.phrases, allTransKeys);
|
|
2065
|
+
if (_perf) performance.mark("loco-dom-start");
|
|
2052
2066
|
var result = await applyTranslationsAsync(state.phrases, state.translations);
|
|
2067
|
+
if (_perf) {
|
|
2068
|
+
performance.mark("loco-dom-end");
|
|
2069
|
+
performance.measure("loco-dom-write-time", "loco-dom-start", "loco-dom-end");
|
|
2070
|
+
performance.measure("loco-apply-total", "loco-apply-start", "loco-dom-end");
|
|
2071
|
+
}
|
|
2053
2072
|
state.observer = watchAndTranslate(state.phrases.map(function(p) {
|
|
2054
2073
|
return p.key + "\0" + (p.context || "");
|
|
2055
2074
|
}), state.translations);
|
|
@@ -2069,7 +2088,12 @@ var Loco = function() {
|
|
|
2069
2088
|
try {
|
|
2070
2089
|
var map = await fetchTranslations(langCode);
|
|
2071
2090
|
state.translations = map || {};
|
|
2091
|
+
if (_perf) performance.mark("loco-collect-start");
|
|
2072
2092
|
state.phrases = await collectPhrasesAsync(document.body);
|
|
2093
|
+
if (_perf) {
|
|
2094
|
+
performance.mark("loco-collect-end");
|
|
2095
|
+
performance.measure("loco-collection-time", "loco-collect-start", "loco-collect-end");
|
|
2096
|
+
}
|
|
2073
2097
|
buildFileVarKeyMap(state.phrases, Object.keys(state.translations));
|
|
2074
2098
|
postKeys(state.phrases).then(function(result2) {
|
|
2075
2099
|
if (result2 && result2.keyMap) {
|
|
@@ -2078,7 +2102,13 @@ var Loco = function() {
|
|
|
2078
2102
|
}
|
|
2079
2103
|
}).catch(function() {
|
|
2080
2104
|
});
|
|
2105
|
+
if (_perf) performance.mark("loco-dom-start");
|
|
2081
2106
|
var result = await applyTranslationsAsync(state.phrases, state.translations);
|
|
2107
|
+
if (_perf) {
|
|
2108
|
+
performance.mark("loco-dom-end");
|
|
2109
|
+
performance.measure("loco-dom-write-time", "loco-dom-start", "loco-dom-end");
|
|
2110
|
+
performance.measure("loco-apply-total", "loco-apply-start", "loco-dom-end");
|
|
2111
|
+
}
|
|
2082
2112
|
state.observer = watchAndTranslate(state.phrases.map(function(p) {
|
|
2083
2113
|
return p.key + "\0" + (p.context || "");
|
|
2084
2114
|
}), state.translations);
|
package/public/loco.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Loco=function(){"use strict";var i={apiKey:null,apiBase:null,phrases:[],translations:{},observer:null,fileMode:!1,fileData:null,fileReadyResolve:null,fileReady:null,fileUrl:null,fileUrls:[],scanStopped:!1,loadedFromCache:!1,screenshotsEnabled:!0,widgetPosition:null},we=["SCRIPT","STYLE","NOSCRIPT","IFRAME","CODE","SVG","AUDIO","VIDEO","LINK"],Le=["VAR","STRONG","EM","B","I","SPAN","A","ABBR","MARK","SMALL","SUB","SUP","U","S","TIME"],Se=["h1","h2","h3","h4","h5","h6","label","legend","caption","figcaption","nav","header","footer","main","section","article","form"],A=new Set(we),D=new Set(Le),he=[].concat(Se),pe=0,ge=!0,k=1e3,G=1e4,me="loco-lang";function U(){try{return localStorage.getItem(me)}catch{return null}}function J(e){try{e?localStorage.setItem(me,e):localStorage.removeItem(me)}catch{}}function Be(e){if(e.blockedTags){var r=e.blockedTags.disabled||[],t=e.blockedTags.custom||[];A=new Set(we.filter(function(n){return r.indexOf(n)<0})),t.forEach(function(n){A.add(n.toUpperCase())})}if(e.inlineTags){var r=e.inlineTags.disabled||[],t=e.inlineTags.custom||[];D=new Set(Le.filter(function(o){return r.indexOf(o)<0})),t.forEach(function(o){D.add(o.toUpperCase())})}if(e.domContextSelectors){var r=e.domContextSelectors.disabled||[],t=e.domContextSelectors.custom||[];he=Se.filter(function(o){return r.indexOf(o)<0}).concat(t)}e.screenshotsEnabled===!1&&(i.screenshotsEnabled=!1),typeof e.contextDepth=="number"&&(pe=e.contextDepth),e.domContextEnabled===!1&&(ge=!1)}function N(e){return e.trim().replace(/\s+/g," ")}function E(e){return!/[a-zA-Z\u00C0-\u024F\u0900-\u097F\u0600-\u06FF]/.test(e)}function Z(e){var r=e.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,"");return!r.trim()||E(r)}function Ae(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function B(e){var t;if(!e||e.nodeType!==1)return!1;const r=(t=e.tagName)==null?void 0:t.toUpperCase();return A.has(r)||e.hasAttribute("notranslate")||e.hasAttribute("data-notranslate")||e.hasAttribute("data-loco-translated")||e.getAttribute("translate")==="no"||e.isContentEditable}function Fe(e){let r=e.parentElement;for(;r&&r!==document.body;){if(B(r))return!0;r=r.parentElement}return!1}const ke=new Set(["H1","H2","H3","H4","H5","H6"]),He=new Set(["SCRIPT","STYLE","NOSCRIPT","CODE"]);let ve=new WeakMap,P=new WeakMap,I=null;function Ce(){if(ge){I=new Set;var e=he.slice();try{var r=e.join(",");document.querySelectorAll(r).forEach(function(t){I.add(t)})}catch{e.forEach(function(n){try{document.querySelectorAll(n).forEach(function(a){I.add(a)})}catch{}})}I.forEach(function(t){P.has(t)||H(t)})}}function z(e){return I?I.has(e):ke.has(e.tagName)?!0:he.some(function(r){try{return e.matches(r)}catch{return!1}})}function je(e){let r="";for(const t of e.childNodes)if(t.nodeType===Node.TEXT_NODE){const n=t.textContent.trim();n&&(r+=(r?" ":"")+n)}return r}function Xe(e,r){for(var t="",n=document.createTreeWalker(e,NodeFilter.SHOW_ALL,{acceptNode:function(o){return o.nodeType===Node.ELEMENT_NODE?He.has(o.tagName)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),a;(a=n.nextNode())&&!(a.nodeType===Node.TEXT_NODE&&(t+=a.textContent,t.length>=r)););return t.trim()}function H(e){if(P.has(e))return P.get(e);let r=null;const t=je(e);if(t)return r=t.substring(0,60),P.set(e,r),r;if(ke.has(e.tagName)){const a=(e.textContent||"").trim().replace(/\s+/g," ");if(a)return r=a.substring(0,60),P.set(e,r),r}var n=Xe(e,200);if(n){const a=n.split(/\n/)[0].trim().replace(/\s+/g," ");a.length>=2&&!E(a)&&(r=a.substring(0,60))}return P.set(e,r),r}function L(e){if(!e||!ge)return"";if(ve.has(e))return ve.get(e);const r=[],t=new Set;let n=e,a=0;if(e&&e.tagName==="TD"){var o=e.closest("table");if(o){var s=o.querySelector("thead tr th:nth-child("+(e.cellIndex+1)+")");if(s){var h=H(s);h&&(t.add(h),r.push(h))}}}for(;n&&n!==document.body&&!(pe>0&&a>=pe);){a++;let d=n.previousElementSibling;for(;d;){var m=d.tagName.toUpperCase();if(A.has(m)){d=d.previousElementSibling;continue}if(m==="ARTICLE"||m==="MAIN"){d=d.previousElementSibling;continue}if(z(d)){const f=H(d);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}let p=null;for(const f of d.children)if(z(f)){p=f;break}if(!p)for(const f of d.children){for(const l of f.children)if(z(l)){p=l;break}if(p)break}if(p){const f=H(p);f&&!t.has(f)&&(t.add(f),r.unshift(f));break}d=d.previousElementSibling}if(z(n)){const p=H(n);p&&!t.has(p)&&(t.add(p),r.unshift(p))}var c=n.tagName;if(c==="ARTICLE"||c==="MAIN")break;n=n.parentElement}const u=r.join(" > ");return ve.set(e,u),u}function Qe(e){return/^\d+$/.test(e)?"number":/^\d+\.\d+$/.test(e)?"decimal":"text"}function We(e,r){for(var t=r.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/),n=[],a=e,o=0;o<t.length;o++){var s=t[o],h=s.match(/^\{\{(text|number|decimal|date):(\d+)\}\}$/);if(h)if(a.indexOf(s)===0)n.push({type:h[1],index:parseInt(h[2]),originalText:s}),a=a.substring(s.length);else{for(var m="",c=o+1;c<t.length;c++){var u=t[c];if(/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(u)){if(a.indexOf(u)>=0){m=u;break}}else if(u!==""){m=u;break}}var d;if(m==="")d=a,a="";else{var p=a.indexOf(m);p>=0?(d=a.substring(0,p),a=a.substring(p)):(d=a,a="")}n.push({type:h[1],index:parseInt(h[2]),originalText:d})}else a.indexOf(s)===0&&(a=a.substring(s.length))}return n}function Y(e,r){e.forEach(function(t){if(!(t.varSlots&&t.varSlots.length>0)){var n=r[t.key];n&&(t.varSlots=We(t.key,n),t.key=n)}})}function $e(e,r){for(var t=r.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),n=e,a=[],o=0;o<t.length;o++)if(o===0)n.indexOf(t[o])===0&&(n=n.substring(t[o].length));else if(t[o]===""&&o===t.length-1)a.push(n),n="";else{var s=n.indexOf(t[o]);s>=0&&(a.push(n.substring(0,s)),n=n.substring(s+t[o].length))}return a.length>0&&a.every(function(h){return/^[a-zA-Z\s]+$/.test(h.trim())})}function Ve(e){for(var r=0,t=/\{\{(text|number|decimal|date):\d+\}\}/g,n;(n=t.exec(e))!==null;)switch(n[1]){case"number":r+=3;break;case"decimal":r+=3;break;case"date":r+=2;break;default:r+=1;break}return r}function R(e,r){for(var t=[],n=0;n<r.length;n++){var a=r[n];if(!(a.indexOf("{{text:")<0&&a.indexOf("{{number:")<0&&a.indexOf("{{decimal:")<0&&a.indexOf("{{date:")<0)){for(var o=[],s=[],h=0,m=/\{\{(text|number|decimal|date):\d+\}\}/g,c;(c=m.exec(a))!==null;)o.push(a.substring(h,c.index)),s.push(c[1]),h=m.lastIndex;o.push(a.substring(h));for(var u="",d=0;d<o.length;d++)if(u+=o[d].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d<s.length)switch(s[d]){case"number":u+="\\d+";break;case"decimal":u+="\\d+\\.\\d+";break;default:u+=".+";break}t.push({pattern:a,regex:new RegExp("^"+u+"$"),specificity:Ve(a)})}}if(t.length!==0){t.sort(function(l,g){return g.specificity-l.specificity});for(var p={},f={},n=0;n<r.length;n++)f[r[n]]=!0;return e.forEach(function(l){if(!f[l.key]&&!(l.key.length>k)){for(var g=0;g<t.length;g++)if(t[g].regex.test(l.key)&&!$e(l.key,t[g].pattern)){p[l.key]=t[g].pattern;break}}}),Y(e,p),p}}function F(e){let r=!1,t=!1;for(const n of e.childNodes)if(n.nodeType===Node.TEXT_NODE&&n.textContent.trim()&&(r=!0),n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="BR")return!1;(a==="VAR"||a==="TIME"&&n.hasAttribute("datetime")||D.has(a))&&(t=!0)}return r&&t}function ee(e){let r="";const t=[];for(const n of e.childNodes){if(n.nodeType===Node.TEXT_NODE){const a=N(n.textContent);a&&(r+=a);continue}if(n.nodeType===Node.ELEMENT_NODE){const a=n.tagName.toUpperCase();if(a==="TIME"&&n.hasAttribute("datetime")){const o=t.length;t.push({type:"date",index:o,raw:n.getAttribute("datetime"),display:n.textContent,node:n}),r+=`{{date:${o}}}`;continue}if(a==="VAR"||D.has(a)){const o=N(n.textContent);if(o){const s=t.length,h=Qe(o);t.push({type:h,index:s,tag:a,value:o,node:n}),r+=`{{${h}:${s}}}`}continue}}}return{key:N(r),slots:t}}var te=["title","placeholder","aria-label"];function Oe(e){const r=[],t=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&F(e)){const{key:c,slots:u}=ee(e);if(c&&c.length<=k)if(Z(c))u.forEach(function(d){if(d.type==="text"&&d.value&&d.value.length>=2&&!E(d.value)){var p=L(d.node||e),f=d.value+"\0"+p;t.has(f)||(t.add(f),r.push({type:"text",key:d.value,slots:[],textNode:d.node?d.node.firstChild:null,element:d.node||e,context:p,original:d.value}))}});else{var n=L(e),a=c+"\0"+n;t.has(a)||t.add(a);const d=u.some(p=>p.type==="date")?"mixed-date":u.some(p=>p.type==="text")?"mixed-text":"mixed";r.push({type:d,key:c,slots:u,element:e,context:n,original:c,originalHTML:e.innerHTML})}}const o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(c){var g,v,x;if(c.nodeType===Node.TEXT_NODE){const y=N(c.textContent);if(!y||y.length<2||y.length>k||E(y)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(y)||Fe(c))return NodeFilter.FILTER_SKIP;const b=(v=(g=c.parentElement)==null?void 0:g.tagName)==null?void 0:v.toUpperCase();if(A.has(b)||F(c.parentElement))return NodeFilter.FILTER_SKIP;for(var u=c.parentElement;u;){var d=(x=u.tagName)==null?void 0:x.toUpperCase();if((d==="VAR"||d==="TIME"||D.has(d))&&u.parentElement&&F(u.parentElement))return NodeFilter.FILTER_SKIP;u=u.parentElement}return NodeFilter.FILTER_ACCEPT}if(c.nodeType===Node.ELEMENT_NODE){const y=c.tagName.toUpperCase();if(A.has(y)||B(c))return NodeFilter.FILTER_REJECT;if(y==="INPUT"){var p=(c.getAttribute("type")||"").toLowerCase();if(p==="button"||p==="submit"||p==="reset"){var f=N(c.value);if(f&&f.length>=2&&!E(f))return NodeFilter.FILTER_ACCEPT}var l=te.some(function(b){var T=N(c.getAttribute(b)||"");return T&&T.length>=2&&!E(T)});return l?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return F(c)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});let s;for(;s=o.nextNode();){if(s.nodeType===Node.TEXT_NODE){const c=N(s.textContent);if(!c)continue;var n=L(s.parentElement),a=c+"\0"+n;t.has(a)||t.add(a),r.push({type:"text",key:c,slots:[],textNode:s,element:s.parentElement,context:n,original:c});continue}if(s.nodeType===Node.ELEMENT_NODE&&s.tagName.toUpperCase()==="INPUT"){var h=(s.getAttribute("type")||"").toLowerCase(),n=L(s);if(h==="button"||h==="submit"||h==="reset"){var m=N(s.value);if(m&&m.length>=2&&!E(m)){var a=m+"\0"+n;t.has(a)||t.add(a),r.push({type:"input-value",key:m,slots:[],element:s,context:n,original:m})}}te.forEach(function(u){var d=N(s.getAttribute(u)||"");if(!(!d||d.length<2||E(d))){var p=d+"\0"+n+"\0"+u;t.has(p)||(t.add(p),r.push({type:"input-attr",key:d,attr:u,slots:[],element:s,context:n,original:d}))}});continue}if(s.nodeType===Node.ELEMENT_NODE){const{key:c,slots:u}=ee(s);if(!c||c.length>k)continue;if(Z(c)){u.forEach(function(l){if(l.type==="text"&&l.value&&l.value.length>=2&&!E(l.value)){var g=L(l.node||s),v=l.value+"\0"+g;t.has(v)||(t.add(v),r.push({type:"text",key:l.value,slots:[],textNode:l.node?l.node.firstChild:null,element:l.node||s,context:g,original:l.value}))}});continue}var n=L(s),a=c+"\0"+n;t.has(a)||t.add(a);const f=u.some(l=>l.type==="date")?"mixed-date":u.some(l=>l.type==="text")?"mixed-text":"mixed";r.push({type:f,key:c,slots:u,element:s,context:n,original:c,originalHTML:s.innerHTML})}}return r}async function j(e,r){r||(r=100);const t=[],n=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&F(e)){const{key:f,slots:l}=ee(e);if(f&&f.length<=k)if(Z(f))l.forEach(function(g){if(g.type==="text"&&g.value&&g.value.length>=2&&!E(g.value)){var v=L(g.node||e),x=g.value+"\0"+v;n.has(x)||(n.add(x),t.push({type:"text",key:g.value,slots:[],textNode:g.node?g.node.firstChild:null,element:g.node||e,context:v,original:g.value}))}});else{var a=L(e),o=f+"\0"+a;n.has(o)||n.add(o);const g=l.some(v=>v.type==="date")?"mixed-date":l.some(v=>v.type==="text")?"mixed-text":"mixed";t.push({type:g,key:f,slots:l,element:e,context:a,original:f,originalHTML:e.innerHTML})}}const s=[],h=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(f){var b,T,S;if(f.nodeType===Node.TEXT_NODE){const w=N(f.textContent);if(!w||w.length<2||w.length>k||E(w)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(w)||Fe(f))return NodeFilter.FILTER_SKIP;const K=(T=(b=f.parentElement)==null?void 0:b.tagName)==null?void 0:T.toUpperCase();if(A.has(K)||F(f.parentElement))return NodeFilter.FILTER_SKIP;for(var l=f.parentElement;l;){var g=(S=l.tagName)==null?void 0:S.toUpperCase();if((g==="VAR"||g==="TIME"||D.has(g))&&l.parentElement&&F(l.parentElement))return NodeFilter.FILTER_SKIP;l=l.parentElement}return NodeFilter.FILTER_ACCEPT}if(f.nodeType===Node.ELEMENT_NODE){const w=f.tagName.toUpperCase();if(A.has(w)||B(f))return NodeFilter.FILTER_REJECT;if(w==="INPUT"){var v=(f.getAttribute("type")||"").toLowerCase();if(v==="button"||v==="submit"||v==="reset"){var x=N(f.value);if(x&&x.length>=2&&!E(x))return NodeFilter.FILTER_ACCEPT}var y=te.some(function(K){var O=N(f.getAttribute(K)||"");return O&&O.length>=2&&!E(O)});return y?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return F(f)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});for(var m;m=h.nextNode();)s.push(m);for(var c=0;c<s.length;c++){c>0&&c%r===0&&await new Promise(function(f){setTimeout(f,0)});var u=s[c];if(u.nodeType===Node.TEXT_NODE){const f=N(u.textContent);if(!f)continue;var a=L(u.parentElement),o=f+"\0"+a;n.has(o)||n.add(o),t.push({type:"text",key:f,slots:[],textNode:u,element:u.parentElement,context:a,original:f});continue}if(u.nodeType===Node.ELEMENT_NODE&&u.tagName.toUpperCase()==="INPUT"){var d=(u.getAttribute("type")||"").toLowerCase(),a=L(u);if(d==="button"||d==="submit"||d==="reset"){var p=N(u.value);if(p&&p.length>=2&&!E(p)){var o=p+"\0"+a;n.has(o)||n.add(o),t.push({type:"input-value",key:p,slots:[],element:u,context:a,original:p})}}te.forEach(function(l){var g=N(u.getAttribute(l)||"");if(!(!g||g.length<2||E(g))){var v=g+"\0"+a+"\0"+l;n.has(v)||(n.add(v),t.push({type:"input-attr",key:g,attr:l,slots:[],element:u,context:a,original:g}))}});continue}if(u.nodeType===Node.ELEMENT_NODE){const{key:f,slots:l}=ee(u);if(!f||f.length>k)continue;if(Z(f)){l.forEach(function(y){if(y.type==="text"&&y.value&&y.value.length>=2&&!E(y.value)){var b=L(y.node||u),T=y.value+"\0"+b;n.has(T)||(n.add(T),t.push({type:"text",key:y.value,slots:[],textNode:y.node?y.node.firstChild:null,element:y.node||u,context:b,original:y.value}))}});continue}var a=L(u),o=f+"\0"+a;n.has(o)||n.add(o);const x=l.some(y=>y.type==="date")?"mixed-date":l.some(y=>y.type==="text")?"mixed-text":"mixed";t.push({type:x,key:f,slots:l,element:u,context:a,original:f,originalHTML:u.innerHTML})}}return t}function ne(e){if(i.scanStopped)return Promise.resolve({ok:!0,registered:0,keyMap:{}});var r=new Set,t=[];return e.forEach(function(n){var a=n.key+"\0"+(n.context||"");r.has(a)||n.varSlots&&n.varSlots.length>0&&/\{\{(?:text|number|decimal|date):\d+\}\}/.test(n.key)||(r.add(a),t.push({key:n.key,context:n.context||""}),n.slots&&n.slots.length>0&&n.slots.forEach(function(o){if(o.type==="text"&&o.value&&!E(o.value)){var s=o.value+"\0";r.has(s)||(r.add(s),t.push({key:o.value,context:""}))}}))}),fetch(i.apiBase+"/api/textnodes",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({keys:t,url:window.location.href})}).then(function(n){return n.json()})}function qe(e){var r=i.apiBase+"/api/translations?lang="+encodeURIComponent(e);return fetch(r,{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){var n={};return Array.isArray(t)?t.forEach(function(a){n[a.key+"\0"+(a.context||"")]=a.value,n.hasOwnProperty(a.key)||(n[a.key]=a.value)}):n=t,n})}function Ge(){if(!(i.fileMode||!i.screenshotsEnabled)){var e=document.createElement("script");e.src=i.apiBase+"/cdn/html2canvas.min.js",e.onload=function(){typeof html2canvas=="function"&&html2canvas(document.body,{scale:.35,logging:!1,useCORS:!0,allowTaint:!0,width:window.innerWidth,height:window.innerHeight,windowWidth:window.innerWidth,windowHeight:window.innerHeight}).then(function(r){var t=r.toDataURL("image/jpeg",.5),n=t.split(",")[1];!n||n.length>5e5||fetch(i.apiBase+"/api/screenshots",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":i.apiKey},body:JSON.stringify({url:window.location.href,screenshot:n})}).catch(function(){})}).catch(function(){})},e.onerror=function(){},document.head.appendChild(e)}}function Je(e,r){return e.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,(t,n,a)=>{const o=r[parseInt(a)];return o?n==="date"?o.display:o.value:t})}function De(e){if(!Array.isArray(e))return e;var r={};return e.forEach(function(t){r[t.key+"\0"+(t.context||"")]=t.value,r.hasOwnProperty(t.key)||(r[t.key]=t.value)}),r}function ye(e,r){let t=0,n=0;return e.forEach(a=>{const o=a.key+"\0"+(a.context||"");var s=r[o]||r[a.key];if(!s&&a.slots&&a.slots.length>0){var h=a.slots.some(function(d){if(d.type!=="text"||!d.value)return!1;var p=d.value+"\0"+(a.context||""),f=d.value+"\0";return r.hasOwnProperty(p)||r.hasOwnProperty(f)||r.hasOwnProperty(d.value)});h&&(s=a.key)}if(!s){n++;return}if(a.type==="input-value"&&a.element)try{a.element.value=s,a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input value",d),n++;return}if(a.type==="input-attr"&&a.element&&a.attr)try{a.element.setAttribute(a.attr,s),a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input attr",d),n++;return}if(a.type==="text"&&a.textNode)try{var m=s;a.varSlots&&a.varSlots.length>0&&(m=m.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,function(d,p,f){var l=a.varSlots.find(function(g){return(g.type||"text")===p&&g.index===+f});return l||(l=a.varSlots[+f]),l?l.originalText:d})),m=m.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,""),a.textNode.nodeValue=m,a.textNode.parentElement&&a.textNode.parentElement.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to text node",d),n++;return}if(a.element){try{const d=Je(s,a.slots);let p=s;var c={};a.slots.forEach(f=>{const l=`{{${f.type}:${f.index}}}`;if(f.type==="date"&&f.node)f.node.textContent=f.display,c[l]=f.node.outerHTML;else if(f.node){if(f.type==="text"&&f.value){var g=f.value+"\0"+(a.context||""),v=f.value+"\0",x=r[g]||r[v]||r[f.value];x&&(f.node.textContent=x)}c[l]=f.node.outerHTML}}),a.varSlots&&a.varSlots.length>0&&a.varSlots.forEach(function(f){var l="{{"+f.type+":"+f.index+"}}";c.hasOwnProperty(l)||(c[l]=Ae(f.originalText))});var u=p.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/g);p=u.map(function(f){return c.hasOwnProperty(f)?c[f]:/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(f)?"":Ae(f)}).join(""),a.element.innerHTML=p,a.element.setAttribute("data-loco-translated",""),t++}catch(d){console.warn("[translate] Could not apply mixed translation",d),n++}return}n++}),{applied:t,skipped:n}}async function re(e,r,t){t||(t=100);for(var n=0,a=0,o=0;o<e.length;o+=t){o>0&&await new Promise(function(m){setTimeout(m,0)});var s=e.slice(o,o+t),h=ye(s,r);n+=h.applied,a+=h.skipped}return{applied:n,skipped:a}}function C(e){let r=0;e.forEach(t=>{try{t.type==="input-value"&&t.element?(t.element.value=t.original,t.element.removeAttribute("data-loco-translated"),r++):t.type==="input-attr"&&t.element&&t.attr?(t.element.setAttribute(t.attr,t.original),t.element.removeAttribute("data-loco-translated"),r++):t.type==="text"&&t.textNode&&(t.textNode.nodeValue=t.original,t.textNode.parentElement&&t.textNode.parentElement.removeAttribute("data-loco-translated"),r++)}catch(n){console.warn("[translate] Could not restore text node",n)}}),e.forEach(t=>{if(t.type!=="text")try{t.element&&t.originalHTML!==void 0&&(t.element.innerHTML=t.originalHTML,t.element.removeAttribute("data-loco-translated"),r++)}catch(n){console.warn("[translate] Could not restore node",n)}}),console.log("[loco] untranslated "+r+" phrase(s)")}function ae(e,r){const t=new Set(e),n=[];Object.values(r).forEach(function(l){if(l&&(t.add(l),/\{\{(text|number|decimal|date):\d+\}\}/.test(l))){var g=l.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),v=g.map(function(x){return x.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")});n.push(new RegExp("^"+v.join(".+")+"$"))}});function a(l){if(t.has(l))return!0;for(var g=0;g<n.length;g++)if(n[g].test(l))return!0;return!1}let o=[],s=null,h=null,m=new Set,c=null,u=!1;function d(){if(o.length!==0){var l=o.splice(0);i.fileMode||ne(l).then(function(g){g&&g.keyMap&&(Y(l,g.keyMap),u=!0,ye(l,r),c&&c.takeRecords(),u=!1)}).catch(function(){})}}function p(l){const g=Oe(l);g.forEach(v=>{var x=v.key+"\0"+(v.context||"");a(v.key)||t.has(x)||(t.add(x),t.add(v.key),o.push(v),i.phrases.push(v))}),R(g,Object.keys(r)),u=!0,ye(g,r),c&&c.takeRecords(),u=!1,i.fileMode||(clearTimeout(s),s=setTimeout(d,500))}function f(l){m.add(l),h||(h=requestAnimationFrame(function(){h=null;var g=Array.from(m);m.clear(),g.forEach(function(v){v.isConnected&&p(v)})}))}return c=new MutationObserver(l=>{if(!u){var g=[],v=new Set;for(const y of l)for(const b of y.addedNodes)if(b.nodeType===Node.ELEMENT_NODE)g.push(b);else if(b.nodeType===Node.TEXT_NODE){var x=b.parentElement;x&&x.isConnected&&v.add(x)}g.forEach(function(y){p(y)}),v.forEach(function(y){f(y)})}}),c.observe(document.body,{childList:!0,subtree:!0}),c}var Pe="loco",Ze=2;function X(){return new Promise(function(e,r){try{var t=indexedDB.open(Pe,Ze);t.onupgradeneeded=function(n){var a=n.target.result;a.objectStoreNames.contains("meta")&&n.oldVersion<2&&a.deleteObjectStore("meta"),a.objectStoreNames.contains("meta")||a.createObjectStore("meta",{keyPath:"key"}),a.objectStoreNames.contains("translations")||a.createObjectStore("translations",{keyPath:"lang"})},t.onsuccess=function(n){e(n.target.result)},t.onerror=function(){r(t.error)}}catch(n){r(n)}})}function ie(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction("meta","readonly"),a=n.objectStore("meta").get("registry");a.onsuccess=function(){e.close();var o=a.result;r(o?{languages:o.languages||[],languageNames:o.languageNames||{}}:null)},a.onerror=function(){e.close(),t(a.error)}})})}function Ie(e){var r="source:"+e;return X().then(function(t){return new Promise(function(n,a){var o=t.transaction("meta","readonly"),s=o.objectStore("meta").get(r);s.onsuccess=function(){t.close();var h=s.result;n(h?{url:h.url,timestamp:h.timestamp,storedAt:h.storedAt}:null)},s.onerror=function(){t.close(),a(s.error)}})})}function ze(e){return X().then(function(r){return new Promise(function(t,n){var a=r.transaction("translations","readonly"),o=a.objectStore("translations").get(e);o.onsuccess=function(){r.close();var s=o.result;t(s?s.data:null)},o.onerror=function(){r.close(),n(o.error)}})})}function Ye(){return X().then(function(e){return new Promise(function(r,t){var n=e.transaction(["meta","translations"],"readonly"),a=n.objectStore("meta"),o=a.get("registry");o.onsuccess=function(){var s=o.result;if(!s||!s.languages||s.languages.length===0){e.close(),r(null);return}var h=U(),m=h||s.languages[0],c=n.objectStore("translations").get(m);c.onsuccess=function(){e.close();var u=c.result;if(!u||!u.data){r(null);return}var d={};d[m]=u.data,r({languages:s.languages,languageNames:s.languageNames||{},translations:d})},c.onerror=function(){e.close(),t(c.error)}},o.onerror=function(){e.close(),t(o.error)}})})}function oe(e,r,t){var n=r.languages||[],a=r.languageNames||{},o=r.translations||{},s=r.timestamp||0;return X().then(function(h){return new Promise(function(m,c){var u=h.transaction(["meta","translations"],"readwrite"),d=u.objectStore("meta"),p=u.objectStore("translations"),f=d.get("registry");f.onsuccess=function(){var l=f.result,g,v;if(t&&l){var x=l.languages||[];g=x.slice();for(var y=0;y<n.length;y++)g.indexOf(n[y])===-1&&g.push(n[y]);v={};var b=l.languageNames||{},T;for(T in b)v[T]=b[T];for(T in a)v[T]=a[T]}else g=n,v=a;d.put({key:"registry",languages:g,languageNames:v}),d.put({key:"source:"+e,url:e,timestamp:s,storedAt:Date.now()});for(var S=0;S<n.length;S++)o[n[S]]&&(t&&Array.isArray(o[n[S]])?function(w){var K=p.get(w);K.onsuccess=function(){var O=K.result,Q=O&&Array.isArray(O.data)?O.data:null,W=o[w];if(Q){for(var Ke="\0",$={},de=[],V=0;V<Q.length;V++){var be=Q[V].key+Ke+(Q[V].context||"");$.hasOwnProperty(be)||de.push(be),$[be]=Q[V]}for(var q=0;q<W.length;q++){var Te=W[q].key+Ke+(W[q].context||"");$.hasOwnProperty(Te)||de.push(Te),$[Te]=W[q]}for(var Ue=[],Ne=0;Ne<de.length;Ne++)Ue.push($[de[Ne]]);p.put({lang:w,data:Ue})}else p.put({lang:w,data:W})}}(n[S]):p.put({lang:n[S],data:o[n[S]]}))},u.oncomplete=function(){h.close(),m()},u.onerror=function(){h.close(),c(u.error)}})})}function et(){return new Promise(function(e){var r=indexedDB.deleteDatabase(Pe);r.onsuccess=function(){e()},r.onerror=function(){e()},r.onblocked=function(){e()}})}var tt='<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><clipPath id="loco-wc"><circle cx="100" cy="100" r="90"/></clipPath></defs><circle cx="100" cy="100" r="90" fill="#1a1f2e"/><g clip-path="url(#loco-wc)"><g transform="translate(100,108) scale(0.72) translate(-334,-198)"><ellipse cx="310" cy="318" rx="10" ry="38" fill="#2ECC88" transform="rotate(-18 310 318)"/><ellipse cx="326" cy="326" rx="9" ry="42" fill="#34D99A" transform="rotate(-6 326 326)"/><ellipse cx="342" cy="328" rx="9" ry="42" fill="#7BC74A" transform="rotate(6 342 328)"/><ellipse cx="357" cy="320" rx="9" ry="36" fill="#F07040" transform="rotate(18 357 320)"/><ellipse cx="334" cy="240" rx="62" ry="80" fill="#2ECC88"/><ellipse cx="334" cy="252" rx="36" ry="52" fill="#D4F4B0"/><path d="M275 220 Q228 190 232 265 Q248 295 280 285 Q268 255 275 220Z" fill="#3A8FE0"/><path d="M277 225 Q238 208 240 262 Q252 285 278 277 Q268 252 277 225Z" fill="#6BB3FF" opacity="0.7"/><path d="M393 220 Q440 190 436 265 Q420 295 388 285 Q400 255 393 220Z" fill="#3A8FE0"/><path d="M391 225 Q430 208 428 262 Q416 285 390 277 Q400 252 391 225Z" fill="#6BB3FF" opacity="0.7"/><ellipse cx="334" cy="172" rx="38" ry="30" fill="#2ECC88"/><circle cx="334" cy="148" r="52" fill="#2ECC88"/><ellipse cx="334" cy="118" rx="30" ry="18" fill="#FFB833"/><circle cx="312" cy="138" r="14" fill="white"/><circle cx="315" cy="140" r="9" fill="#2C2C2A"/><circle cx="315" cy="140" r="4" fill="#04342C"/><circle cx="319" cy="136" r="3.5" fill="white"/><circle cx="356" cy="138" r="14" fill="white"/><circle cx="353" cy="140" r="9" fill="#2C2C2A"/><circle cx="353" cy="140" r="4" fill="#04342C"/><circle cx="357" cy="136" r="3.5" fill="white"/><path d="M326 155 Q334 144 342 155 Q342 170 334 173 Q326 170 326 155Z" fill="#E8A020"/><path d="M328 165 Q334 158 340 165 Q340 174 334 176 Q328 174 328 165Z" fill="#A06010"/><ellipse cx="302" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><ellipse cx="366" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><path d="M320 100 Q316 68 308 52" stroke="#FFB833" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M334 97 Q334 64 334 46" stroke="#7BC74A" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M348 100 Q352 68 360 52" stroke="#F07040" stroke-width="6" fill="none" stroke-linecap="round"/><circle cx="308" cy="50" r="8" fill="#FFB833"/><circle cx="334" cy="44" r="8" fill="#7BC74A"/><circle cx="360" cy="50" r="8" fill="#F07040"/><rect x="260" y="330" width="168" height="10" rx="5" fill="#8B5E20"/><path d="M310 330 L300 350 M310 330 L315 352 M310 330 L325 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M360 330 L350 350 M360 330 L365 352 M360 330 L375 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/></g></g></svg>',xe=null;function se(e,r){xe=r;var t=document.getElementById("loco-lang-widget");t&&t.remove();var n={},a=e.map(function(l){return typeof l=="object"&&l.code?(l.name&&(n[l.code]=l.name),l.code):l});function o(l){return n[l]||l}var s=U()||null,h=document.createElement("div");h.id="loco-lang-widget",h.setAttribute("data-notranslate","");var m={"bottom-right":"bottom:20px;right:20px;","bottom-left":"bottom:20px;left:20px;","top-right":"top:20px;right:20px;","top-left":"top:20px;left:20px;"};h.style.cssText='position:fixed;z-index:2147483647;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;'+(m[r]||m["bottom-right"]);var c=document.createElement("button");c.innerHTML=tt,c.style.cssText="width:52px;height:52px;border-radius:50%;border:none;background:#1a1f2e;color:#fff;font-size:22px;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,0.25);display:flex;align-items:center;justify-content:center;transition:transform 0.2s,box-shadow 0.2s;overflow:hidden;padding:0;",c.onmouseenter=function(){c.style.transform="scale(1.1)",c.style.boxShadow="0 6px 20px rgba(0,0,0,0.35)"},c.onmouseleave=function(){c.style.transform="scale(1)",c.style.boxShadow="0 4px 14px rgba(0,0,0,0.25)"};var u=document.createElement("div");u.style.cssText="display:none;position:absolute;"+(r.indexOf("bottom")===0?"bottom:56px;":"top:56px;")+(r.indexOf("right")>=0?"right:0;":"left:0;")+"background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,0.18);min-width:200px;max-height:320px;overflow-y:auto;padding:6px 0;";var d=document.createElement("div");d.textContent="Original",d.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;font-weight:600;border-bottom:1px solid #eee;",d.onmouseenter=function(){d.style.background="#f5f5f5"},d.onmouseleave=function(){d.style.background="transparent"},d.onclick=function(){s=null,window.Loco.restore(),f(),u.style.display="none"},u.appendChild(d);var p=[];a.forEach(function(l){var g=document.createElement("div");g.textContent=o(l),g.setAttribute("data-lang",l),g.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;",g.onmouseenter=function(){g.style.background="#f5f5f5"},g.onmouseleave=function(){g.style.background=s===l?"#e8f0fe":"transparent"},g.onclick=function(){s=l,window.Loco.apply(l),f(),u.style.display="none"},u.appendChild(g),p.push({el:g,code:l})});function f(){d.style.background=s===null?"#e8f0fe":"transparent",d.style.fontWeight=s===null?"600":"400",p.forEach(function(l){l.el.style.background=s===l.code?"#e8f0fe":"transparent",l.el.style.fontWeight=s===l.code?"600":"400"})}c.onclick=function(l){l.stopPropagation(),u.style.display=u.style.display==="none"?"block":"none"},document.addEventListener("click",function(l){h.contains(l.target)||(u.style.display="none")}),f(),h.appendChild(u),h.appendChild(c),document.body.appendChild(h)}function nt(e){xe&&(!e||e.length===0||se(e,xe))}var _={__proto__:1,constructor:1,prototype:1};function Re(e){if(!e||typeof e!="string")return!1;if(e.charAt(0)==="/"||e.charAt(0)===".")return!0;try{var r=new URL(e,window.location.origin);return r.protocol==="http:"||r.protocol==="https:"}catch{return!1}}function le(e){if(!e||typeof e!="object"||Array.isArray(e))return null;if(Array.isArray(e._raw)){for(var r={},t={},n=0;n<e._raw.length;n++){var a=e._raw[n];!a||typeof a.l!="string"||typeof a.k!="string"||typeof a.v!="string"||(r[a.l]||(r[a.l]=!0,t[a.l]=[]),t[a.l].push({key:a.k,context:typeof a.c=="string"?a.c:"",value:a.v}))}e={languages:Object.keys(r).sort(),languageNames:{},translations:t,timestamp:0}}var o={};if(!Array.isArray(e.languages))return null;o.languages=[];for(var s=0;s<e.languages.length;s++){if(typeof e.languages[s]!="string"||e.languages[s].length>20)return null;o.languages.push(e.languages[s])}if(o.timestamp=typeof e.timestamp=="number"&&isFinite(e.timestamp)?e.timestamp:0,o.languageNames={},e.languageNames&&typeof e.languageNames=="object"&&!Array.isArray(e.languageNames))for(var h in e.languageNames)!e.languageNames.hasOwnProperty(h)||_[h]||typeof e.languageNames[h]=="string"&&e.languageNames[h].length<=100&&(o.languageNames[h]=e.languageNames[h]);if(o.translations={},e.translations&&typeof e.translations=="object"&&!Array.isArray(e.translations)){for(var m in e.translations)if(!(!e.translations.hasOwnProperty(m)||_[m])&&o.languages.indexOf(m)!==-1){var c=e.translations[m];if(Array.isArray(c)){for(var u=[],d=0;d<c.length;d++){var p=c[d];!p||typeof p!="object"||typeof p.key!="string"||typeof p.value!="string"||p.key.length>G||p.value.length>G||_[p.key]||u.push({key:p.key,value:p.value,context:typeof p.context=="string"?p.context:""})}o.translations[m]=u}else if(typeof c=="object"){var f={};for(var l in c)!c.hasOwnProperty(l)||_[l]||typeof c[l]=="string"&&(l.length>G||c[l].length>G||(f[l]=c[l]));o.translations[m]=f}}}return o}async function _e(){try{var e=await fetch(i.apiBase+"/api/project/crawler-config",{headers:{"X-API-Key":i.apiKey}});e.ok&&Be(await e.json())}catch{}Ce(),i.phrases=await j(document.body),ne(i.phrases).then(function(t){t&&t.keyMap&&Y(i.phrases,t.keyMap)}).catch(function(t){console.warn("[loco] Failed to register keys:",t)}),!i.scanStopped&&i.screenshotsEnabled&&setTimeout(Ge,3e3),console.log("[loco] "+i.phrases.length+" text nodes discovered"),console.log(` Loco.textnodes() — list all discovered text nodes
|
|
1
|
+
var Loco=function(){"use strict";var o={apiKey:null,apiBase:null,phrases:[],translations:{},observer:null,fileMode:!1,fileData:null,fileReadyResolve:null,fileReady:null,fileUrl:null,fileUrls:[],scanStopped:!1,loadedFromCache:!1,screenshotsEnabled:!0,widgetPosition:null},Ne=["SCRIPT","STYLE","NOSCRIPT","IFRAME","CODE","SVG","AUDIO","VIDEO","LINK"],Le=["VAR","STRONG","EM","B","I","SPAN","A","ABBR","MARK","SMALL","SUB","SUP","U","S","TIME"],Se=["h1","h2","h3","h4","h5","h6","label","legend","caption","figcaption","nav","header","footer","main","section","article","form"],A=new Set(Ne),D=new Set(Le),he=[].concat(Se),pe=0,me=!0,F=1e3,G=1e4,ge="loco-lang";function U(){try{return localStorage.getItem(ge)}catch{return null}}function J(e){try{e?localStorage.setItem(ge,e):localStorage.removeItem(ge)}catch{}}function Be(e){if(e.blockedTags){var n=e.blockedTags.disabled||[],t=e.blockedTags.custom||[];A=new Set(Ne.filter(function(r){return n.indexOf(r)<0})),t.forEach(function(r){A.add(r.toUpperCase())})}if(e.inlineTags){var n=e.inlineTags.disabled||[],t=e.inlineTags.custom||[];D=new Set(Le.filter(function(l){return n.indexOf(l)<0})),t.forEach(function(l){D.add(l.toUpperCase())})}if(e.domContextSelectors){var n=e.domContextSelectors.disabled||[],t=e.domContextSelectors.custom||[];he=Se.filter(function(l){return n.indexOf(l)<0}).concat(t)}e.screenshotsEnabled===!1&&(o.screenshotsEnabled=!1),typeof e.contextDepth=="number"&&(pe=e.contextDepth),e.domContextEnabled===!1&&(me=!1)}function w(e){return e.trim().replace(/\s+/g," ")}function E(e){return!/[a-zA-Z\u00C0-\u024F\u0900-\u097F\u0600-\u06FF]/.test(e)}function Z(e){var n=e.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,"");return!n.trim()||E(n)}function Ae(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function B(e){var t;if(!e||e.nodeType!==1)return!1;const n=(t=e.tagName)==null?void 0:t.toUpperCase();return A.has(n)||e.hasAttribute("notranslate")||e.hasAttribute("data-notranslate")||e.hasAttribute("data-loco-translated")||e.getAttribute("translate")==="no"||e.isContentEditable}function ke(e){let n=e.parentElement;for(;n&&n!==document.body;){if(B(n))return!0;n=n.parentElement}return!1}const Fe=new Set(["H1","H2","H3","H4","H5","H6"]),He=new Set(["SCRIPT","STYLE","NOSCRIPT","CODE"]);let ve=new WeakMap,P=new WeakMap,I=null;function Ce(){if(me){I=new Set;var e=he.slice();try{var n=e.join(",");document.querySelectorAll(n).forEach(function(t){I.add(t)})}catch{e.forEach(function(r){try{document.querySelectorAll(r).forEach(function(a){I.add(a)})}catch{}})}I.forEach(function(t){P.has(t)||H(t)})}}function z(e){return I?I.has(e):Fe.has(e.tagName)?!0:he.some(function(n){try{return e.matches(n)}catch{return!1}})}function je(e){let n="";for(const t of e.childNodes)if(t.nodeType===Node.TEXT_NODE){const r=t.textContent.trim();r&&(n+=(n?" ":"")+r)}return n}function Xe(e,n){for(var t="",r=document.createTreeWalker(e,NodeFilter.SHOW_ALL,{acceptNode:function(l){return l.nodeType===Node.ELEMENT_NODE?He.has(l.tagName)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),a;(a=r.nextNode())&&!(a.nodeType===Node.TEXT_NODE&&(t+=a.textContent,t.length>=n)););return t.trim()}function H(e){if(P.has(e))return P.get(e);let n=null;const t=je(e);if(t)return n=t.substring(0,60),P.set(e,n),n;if(Fe.has(e.tagName)){const a=(e.textContent||"").trim().replace(/\s+/g," ");if(a)return n=a.substring(0,60),P.set(e,n),n}var r=Xe(e,200);if(r){const a=r.split(/\n/)[0].trim().replace(/\s+/g," ");a.length>=2&&!E(a)&&(n=a.substring(0,60))}return P.set(e,n),n}function L(e){if(!e||!me)return"";if(ve.has(e))return ve.get(e);const n=[],t=new Set;let r=e,a=0;if(e&&e.tagName==="TD"){var l=e.closest("table");if(l){var i=l.querySelector("thead tr th:nth-child("+(e.cellIndex+1)+")");if(i){var h=H(i);h&&(t.add(h),n.push(h))}}}for(;r&&r!==document.body&&!(pe>0&&a>=pe);){a++;let d=r.previousElementSibling;for(;d;){var g=d.tagName.toUpperCase();if(A.has(g)){d=d.previousElementSibling;continue}if(g==="ARTICLE"||g==="MAIN"){d=d.previousElementSibling;continue}if(z(d)){const f=H(d);f&&!t.has(f)&&(t.add(f),n.unshift(f));break}let p=null;for(const f of d.children)if(z(f)){p=f;break}if(!p)for(const f of d.children){for(const s of f.children)if(z(s)){p=s;break}if(p)break}if(p){const f=H(p);f&&!t.has(f)&&(t.add(f),n.unshift(f));break}d=d.previousElementSibling}if(z(r)){const p=H(r);p&&!t.has(p)&&(t.add(p),n.unshift(p))}var c=r.tagName;if(c==="ARTICLE"||c==="MAIN")break;r=r.parentElement}const u=n.join(" > ");return ve.set(e,u),u}function Qe(e){return/^\d+$/.test(e)?"number":/^\d+\.\d+$/.test(e)?"decimal":"text"}function We(e,n){for(var t=n.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/),r=[],a=e,l=0;l<t.length;l++){var i=t[l],h=i.match(/^\{\{(text|number|decimal|date):(\d+)\}\}$/);if(h)if(a.indexOf(i)===0)r.push({type:h[1],index:parseInt(h[2]),originalText:i}),a=a.substring(i.length);else{for(var g="",c=l+1;c<t.length;c++){var u=t[c];if(/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(u)){if(a.indexOf(u)>=0){g=u;break}}else if(u!==""){g=u;break}}var d;if(g==="")d=a,a="";else{var p=a.indexOf(g);p>=0?(d=a.substring(0,p),a=a.substring(p)):(d=a,a="")}r.push({type:h[1],index:parseInt(h[2]),originalText:d})}else a.indexOf(i)===0&&(a=a.substring(i.length))}return r}function Y(e,n){e.forEach(function(t){if(!(t.varSlots&&t.varSlots.length>0)){var r=n[t.key];r&&(t.varSlots=We(t.key,r),t.key=r)}})}function $e(e,n){for(var t=n.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),r=e,a=[],l=0;l<t.length;l++)if(l===0)r.indexOf(t[l])===0&&(r=r.substring(t[l].length));else if(t[l]===""&&l===t.length-1)a.push(r),r="";else{var i=r.indexOf(t[l]);i>=0&&(a.push(r.substring(0,i)),r=r.substring(i+t[l].length))}return a.length>0&&a.every(function(h){return/^[a-zA-Z\s]+$/.test(h.trim())})}function Ve(e){for(var n=0,t=/\{\{(text|number|decimal|date):\d+\}\}/g,r;(r=t.exec(e))!==null;)switch(r[1]){case"number":n+=3;break;case"decimal":n+=3;break;case"date":n+=2;break;default:n+=1;break}return n}function _(e,n){for(var t=[],r=0;r<n.length;r++){var a=n[r];if(!(a.indexOf("{{text:")<0&&a.indexOf("{{number:")<0&&a.indexOf("{{decimal:")<0&&a.indexOf("{{date:")<0)){for(var l=[],i=[],h=0,g=/\{\{(text|number|decimal|date):\d+\}\}/g,c;(c=g.exec(a))!==null;)l.push(a.substring(h,c.index)),i.push(c[1]),h=g.lastIndex;l.push(a.substring(h));for(var u="",d=0;d<l.length;d++)if(u+=l[d].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d<i.length)switch(i[d]){case"number":u+="\\d+";break;case"decimal":u+="\\d+\\.\\d+";break;default:u+=".+";break}t.push({pattern:a,regex:new RegExp("^"+u+"$"),specificity:Ve(a)})}}if(t.length!==0){t.sort(function(s,m){return m.specificity-s.specificity});for(var p={},f={},r=0;r<n.length;r++)f[n[r]]=!0;return e.forEach(function(s){if(!f[s.key]&&!(s.key.length>F)){for(var m=0;m<t.length;m++)if(t[m].regex.test(s.key)&&!$e(s.key,t[m].pattern)){p[s.key]=t[m].pattern;break}}}),Y(e,p),p}}function k(e){let n=!1,t=!1;for(const r of e.childNodes)if(r.nodeType===Node.TEXT_NODE&&r.textContent.trim()&&(n=!0),r.nodeType===Node.ELEMENT_NODE){const a=r.tagName.toUpperCase();if(a==="BR")return!1;(a==="VAR"||a==="TIME"&&r.hasAttribute("datetime")||D.has(a))&&(t=!0)}return n&&t}function ee(e){let n="";const t=[];for(const r of e.childNodes){if(r.nodeType===Node.TEXT_NODE){const a=w(r.textContent);a&&(n+=a);continue}if(r.nodeType===Node.ELEMENT_NODE){const a=r.tagName.toUpperCase();if(a==="TIME"&&r.hasAttribute("datetime")){const l=t.length;t.push({type:"date",index:l,raw:r.getAttribute("datetime"),display:r.textContent,node:r}),n+=`{{date:${l}}}`;continue}if(a==="VAR"||D.has(a)){const l=w(r.textContent);if(l){const i=t.length,h=Qe(l);t.push({type:h,index:i,tag:a,value:l,node:r}),n+=`{{${h}:${i}}}`}continue}}}return{key:w(n),slots:t}}var te=["title","placeholder","aria-label"];function Oe(e){const n=[],t=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&k(e)){const{key:c,slots:u}=ee(e);if(c&&c.length<=F)if(Z(c))u.forEach(function(d){if(d.type==="text"&&d.value&&d.value.length>=2&&!E(d.value)){var p=L(d.node||e),f=d.value+"\0"+p;t.has(f)||(t.add(f),n.push({type:"text",key:d.value,slots:[],textNode:d.node?d.node.firstChild:null,element:d.node||e,context:p,original:d.value}))}});else{var r=L(e),a=c+"\0"+r;t.has(a)||t.add(a);const d=u.some(p=>p.type==="date")?"mixed-date":u.some(p=>p.type==="text")?"mixed-text":"mixed";n.push({type:d,key:c,slots:u,element:e,context:r,original:c,originalHTML:e.innerHTML})}}const l=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(c){var m,v,x;if(c.nodeType===Node.TEXT_NODE){const y=w(c.textContent);if(!y||y.length<2||y.length>F||E(y)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(y)||ke(c))return NodeFilter.FILTER_SKIP;const b=(v=(m=c.parentElement)==null?void 0:m.tagName)==null?void 0:v.toUpperCase();if(A.has(b)||k(c.parentElement))return NodeFilter.FILTER_SKIP;for(var u=c.parentElement;u;){var d=(x=u.tagName)==null?void 0:x.toUpperCase();if((d==="VAR"||d==="TIME"||D.has(d))&&u.parentElement&&k(u.parentElement))return NodeFilter.FILTER_SKIP;u=u.parentElement}return NodeFilter.FILTER_ACCEPT}if(c.nodeType===Node.ELEMENT_NODE){const y=c.tagName.toUpperCase();if(A.has(y)||B(c))return NodeFilter.FILTER_REJECT;if(y==="INPUT"){var p=(c.getAttribute("type")||"").toLowerCase();if(p==="button"||p==="submit"||p==="reset"){var f=w(c.value);if(f&&f.length>=2&&!E(f))return NodeFilter.FILTER_ACCEPT}var s=te.some(function(b){var T=w(c.getAttribute(b)||"");return T&&T.length>=2&&!E(T)});return s?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return k(c)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});let i;for(;i=l.nextNode();){if(i.nodeType===Node.TEXT_NODE){const c=w(i.textContent);if(!c)continue;var r=L(i.parentElement),a=c+"\0"+r;t.has(a)||t.add(a),n.push({type:"text",key:c,slots:[],textNode:i,element:i.parentElement,context:r,original:c});continue}if(i.nodeType===Node.ELEMENT_NODE&&i.tagName.toUpperCase()==="INPUT"){var h=(i.getAttribute("type")||"").toLowerCase(),r=L(i);if(h==="button"||h==="submit"||h==="reset"){var g=w(i.value);if(g&&g.length>=2&&!E(g)){var a=g+"\0"+r;t.has(a)||t.add(a),n.push({type:"input-value",key:g,slots:[],element:i,context:r,original:g})}}te.forEach(function(u){var d=w(i.getAttribute(u)||"");if(!(!d||d.length<2||E(d))){var p=d+"\0"+r+"\0"+u;t.has(p)||(t.add(p),n.push({type:"input-attr",key:d,attr:u,slots:[],element:i,context:r,original:d}))}});continue}if(i.nodeType===Node.ELEMENT_NODE){const{key:c,slots:u}=ee(i);if(!c||c.length>F)continue;if(Z(c)){u.forEach(function(s){if(s.type==="text"&&s.value&&s.value.length>=2&&!E(s.value)){var m=L(s.node||i),v=s.value+"\0"+m;t.has(v)||(t.add(v),n.push({type:"text",key:s.value,slots:[],textNode:s.node?s.node.firstChild:null,element:s.node||i,context:m,original:s.value}))}});continue}var r=L(i),a=c+"\0"+r;t.has(a)||t.add(a);const f=u.some(s=>s.type==="date")?"mixed-date":u.some(s=>s.type==="text")?"mixed-text":"mixed";n.push({type:f,key:c,slots:u,element:i,context:r,original:c,originalHTML:i.innerHTML})}}return n}async function j(e,n){n||(n=100);const t=[],r=new Set;if(e.nodeType===Node.ELEMENT_NODE&&!B(e)&&k(e)){const{key:f,slots:s}=ee(e);if(f&&f.length<=F)if(Z(f))s.forEach(function(m){if(m.type==="text"&&m.value&&m.value.length>=2&&!E(m.value)){var v=L(m.node||e),x=m.value+"\0"+v;r.has(x)||(r.add(x),t.push({type:"text",key:m.value,slots:[],textNode:m.node?m.node.firstChild:null,element:m.node||e,context:v,original:m.value}))}});else{var a=L(e),l=f+"\0"+a;r.has(l)||r.add(l);const m=s.some(v=>v.type==="date")?"mixed-date":s.some(v=>v.type==="text")?"mixed-text":"mixed";t.push({type:m,key:f,slots:s,element:e,context:a,original:f,originalHTML:e.innerHTML})}}const i=[],h=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode(f){var b,T,S;if(f.nodeType===Node.TEXT_NODE){const N=w(f.textContent);if(!N||N.length<2||N.length>F||E(N)||/\{\{(?:text|number|decimal|date):\d+\}\}/.test(N)||ke(f))return NodeFilter.FILTER_SKIP;const K=(T=(b=f.parentElement)==null?void 0:b.tagName)==null?void 0:T.toUpperCase();if(A.has(K)||k(f.parentElement))return NodeFilter.FILTER_SKIP;for(var s=f.parentElement;s;){var m=(S=s.tagName)==null?void 0:S.toUpperCase();if((m==="VAR"||m==="TIME"||D.has(m))&&s.parentElement&&k(s.parentElement))return NodeFilter.FILTER_SKIP;s=s.parentElement}return NodeFilter.FILTER_ACCEPT}if(f.nodeType===Node.ELEMENT_NODE){const N=f.tagName.toUpperCase();if(A.has(N)||B(f))return NodeFilter.FILTER_REJECT;if(N==="INPUT"){var v=(f.getAttribute("type")||"").toLowerCase();if(v==="button"||v==="submit"||v==="reset"){var x=w(f.value);if(x&&x.length>=2&&!E(x))return NodeFilter.FILTER_ACCEPT}var y=te.some(function(K){var O=w(f.getAttribute(K)||"");return O&&O.length>=2&&!E(O)});return y?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return k(f)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}});for(var g;g=h.nextNode();)i.push(g);for(var c=0;c<i.length;c++){c>0&&c%n===0&&await new Promise(function(f){setTimeout(f,0)});var u=i[c];if(u.nodeType===Node.TEXT_NODE){const f=w(u.textContent);if(!f)continue;var a=L(u.parentElement),l=f+"\0"+a;r.has(l)||r.add(l),t.push({type:"text",key:f,slots:[],textNode:u,element:u.parentElement,context:a,original:f});continue}if(u.nodeType===Node.ELEMENT_NODE&&u.tagName.toUpperCase()==="INPUT"){var d=(u.getAttribute("type")||"").toLowerCase(),a=L(u);if(d==="button"||d==="submit"||d==="reset"){var p=w(u.value);if(p&&p.length>=2&&!E(p)){var l=p+"\0"+a;r.has(l)||r.add(l),t.push({type:"input-value",key:p,slots:[],element:u,context:a,original:p})}}te.forEach(function(s){var m=w(u.getAttribute(s)||"");if(!(!m||m.length<2||E(m))){var v=m+"\0"+a+"\0"+s;r.has(v)||(r.add(v),t.push({type:"input-attr",key:m,attr:s,slots:[],element:u,context:a,original:m}))}});continue}if(u.nodeType===Node.ELEMENT_NODE){const{key:f,slots:s}=ee(u);if(!f||f.length>F)continue;if(Z(f)){s.forEach(function(y){if(y.type==="text"&&y.value&&y.value.length>=2&&!E(y.value)){var b=L(y.node||u),T=y.value+"\0"+b;r.has(T)||(r.add(T),t.push({type:"text",key:y.value,slots:[],textNode:y.node?y.node.firstChild:null,element:y.node||u,context:b,original:y.value}))}});continue}var a=L(u),l=f+"\0"+a;r.has(l)||r.add(l);const x=s.some(y=>y.type==="date")?"mixed-date":s.some(y=>y.type==="text")?"mixed-text":"mixed";t.push({type:x,key:f,slots:s,element:u,context:a,original:f,originalHTML:u.innerHTML})}}return t}function ne(e){if(o.scanStopped)return Promise.resolve({ok:!0,registered:0,keyMap:{}});var n=new Set,t=[];return e.forEach(function(r){var a=r.key+"\0"+(r.context||"");n.has(a)||r.varSlots&&r.varSlots.length>0&&/\{\{(?:text|number|decimal|date):\d+\}\}/.test(r.key)||(n.add(a),t.push({key:r.key,context:r.context||""}),r.slots&&r.slots.length>0&&r.slots.forEach(function(l){if(l.type==="text"&&l.value&&!E(l.value)){var i=l.value+"\0";n.has(i)||(n.add(i),t.push({key:l.value,context:""}))}}))}),fetch(o.apiBase+"/api/textnodes",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":o.apiKey},body:JSON.stringify({keys:t,url:window.location.href})}).then(function(r){return r.json()})}function qe(e){var n=o.apiBase+"/api/translations?lang="+encodeURIComponent(e);return fetch(n,{headers:{"X-API-Key":o.apiKey}}).then(function(t){return t.json()}).then(function(t){var r={};return Array.isArray(t)?t.forEach(function(a){r[a.key+"\0"+(a.context||"")]=a.value,r.hasOwnProperty(a.key)||(r[a.key]=a.value)}):r=t,r})}function Ge(){if(!(o.fileMode||!o.screenshotsEnabled)){var e=document.createElement("script");e.src=o.apiBase+"/cdn/html2canvas.min.js",e.onload=function(){typeof html2canvas=="function"&&html2canvas(document.body,{scale:.35,logging:!1,useCORS:!0,allowTaint:!0,width:window.innerWidth,height:window.innerHeight,windowWidth:window.innerWidth,windowHeight:window.innerHeight}).then(function(n){var t=n.toDataURL("image/jpeg",.5),r=t.split(",")[1];!r||r.length>5e5||fetch(o.apiBase+"/api/screenshots",{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":o.apiKey},body:JSON.stringify({url:window.location.href,screenshot:r})}).catch(function(){})}).catch(function(){})},e.onerror=function(){},document.head.appendChild(e)}}function Je(e,n){return e.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,(t,r,a)=>{const l=n[parseInt(a)];return l?r==="date"?l.display:l.value:t})}function De(e){if(!Array.isArray(e))return e;var n={};return e.forEach(function(t){n[t.key+"\0"+(t.context||"")]=t.value,n.hasOwnProperty(t.key)||(n[t.key]=t.value)}),n}function ye(e,n){let t=0,r=0;return e.forEach(a=>{const l=a.key+"\0"+(a.context||"");var i=n[l]||n[a.key];if(!i&&a.slots&&a.slots.length>0){var h=a.slots.some(function(d){if(d.type!=="text"||!d.value)return!1;var p=d.value+"\0"+(a.context||""),f=d.value+"\0";return n.hasOwnProperty(p)||n.hasOwnProperty(f)||n.hasOwnProperty(d.value)});h&&(i=a.key)}if(!i){r++;return}if(a.type==="input-value"&&a.element)try{a.element.value=i,a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input value",d),r++;return}if(a.type==="input-attr"&&a.element&&a.attr)try{a.element.setAttribute(a.attr,i),a.element.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to input attr",d),r++;return}if(a.type==="text"&&a.textNode)try{var g=i;a.varSlots&&a.varSlots.length>0&&(g=g.replace(/\{\{(text|number|decimal|date):(\d+)\}\}/g,function(d,p,f){var s=a.varSlots.find(function(m){return(m.type||"text")===p&&m.index===+f});return s||(s=a.varSlots[+f]),s?s.originalText:d})),g=g.replace(/\{\{(?:text|number|decimal|date):\d+\}\}/g,""),a.textNode.nodeValue=g,a.textNode.parentElement&&a.textNode.parentElement.setAttribute("data-loco-translated",""),t++;return}catch(d){console.warn("[translate] Could not write to text node",d),r++;return}if(a.element){try{const d=Je(i,a.slots);let p=i;var c={};a.slots.forEach(f=>{const s=`{{${f.type}:${f.index}}}`;if(f.type==="date"&&f.node)f.node.textContent=f.display,c[s]=f.node.outerHTML;else if(f.node){if(f.type==="text"&&f.value){var m=f.value+"\0"+(a.context||""),v=f.value+"\0",x=n[m]||n[v]||n[f.value];x&&(f.node.textContent=x)}c[s]=f.node.outerHTML}}),a.varSlots&&a.varSlots.length>0&&a.varSlots.forEach(function(f){var s="{{"+f.type+":"+f.index+"}}";c.hasOwnProperty(s)||(c[s]=Ae(f.originalText))});var u=p.split(/(\{\{(?:text|number|decimal|date):\d+\}\})/g);p=u.map(function(f){return c.hasOwnProperty(f)?c[f]:/^\{\{(?:text|number|decimal|date):\d+\}\}$/.test(f)?"":Ae(f)}).join(""),a.element.innerHTML=p,a.element.setAttribute("data-loco-translated",""),t++}catch(d){console.warn("[translate] Could not apply mixed translation",d),r++}return}r++}),{applied:t,skipped:r}}async function re(e,n,t){t||(t=100);for(var r=0,a=0,l=performance.now(),i=0;i<e.length;i+=t){i>0&&performance.now()-l>16&&(await new Promise(function(c){requestAnimationFrame(c)}),l=performance.now());var h=e.slice(i,i+t),g=ye(h,n);r+=g.applied,a+=g.skipped}return{applied:r,skipped:a}}function C(e){let n=0;e.forEach(t=>{try{t.type==="input-value"&&t.element?(t.element.value=t.original,t.element.removeAttribute("data-loco-translated"),n++):t.type==="input-attr"&&t.element&&t.attr?(t.element.setAttribute(t.attr,t.original),t.element.removeAttribute("data-loco-translated"),n++):t.type==="text"&&t.textNode&&(t.textNode.nodeValue=t.original,t.textNode.parentElement&&t.textNode.parentElement.removeAttribute("data-loco-translated"),n++)}catch(r){console.warn("[translate] Could not restore text node",r)}}),e.forEach(t=>{if(t.type!=="text")try{t.element&&t.originalHTML!==void 0&&(t.element.innerHTML=t.originalHTML,t.element.removeAttribute("data-loco-translated"),n++)}catch(r){console.warn("[translate] Could not restore node",r)}}),console.log("[loco] untranslated "+n+" phrase(s)")}function ae(e,n){const t=new Set(e),r=[];Object.values(n).forEach(function(s){if(s&&(t.add(s),/\{\{(text|number|decimal|date):\d+\}\}/.test(s))){var m=s.split(/\{\{(?:text|number|decimal|date):\d+\}\}/g),v=m.map(function(x){return x.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")});r.push(new RegExp("^"+v.join(".+")+"$"))}});function a(s){if(t.has(s))return!0;for(var m=0;m<r.length;m++)if(r[m].test(s))return!0;return!1}let l=[],i=null,h=null,g=new Set,c=null,u=!1;function d(){if(l.length!==0){var s=l.splice(0);o.fileMode||ne(s).then(function(m){m&&m.keyMap&&(Y(s,m.keyMap),u=!0,ye(s,n),c&&c.takeRecords(),u=!1)}).catch(function(){})}}function p(s){const m=Oe(s);m.forEach(v=>{var x=v.key+"\0"+(v.context||"");a(v.key)||t.has(x)||(t.add(x),t.add(v.key),l.push(v),o.phrases.push(v))}),_(m,Object.keys(n)),u=!0,ye(m,n),c&&c.takeRecords(),u=!1,o.fileMode||(clearTimeout(i),i=setTimeout(d,500))}function f(s){g.add(s),h||(h=requestAnimationFrame(function(){h=null;var m=Array.from(g);g.clear(),m.forEach(function(v){v.isConnected&&p(v)})}))}return c=new MutationObserver(s=>{if(!u){var m=[],v=new Set;for(const y of s)for(const b of y.addedNodes)if(b.nodeType===Node.ELEMENT_NODE)m.push(b);else if(b.nodeType===Node.TEXT_NODE){var x=b.parentElement;x&&x.isConnected&&v.add(x)}m.forEach(function(y){p(y)}),v.forEach(function(y){f(y)})}}),c.observe(document.body,{childList:!0,subtree:!0}),c}var Pe="loco",Ze=2;function X(){return new Promise(function(e,n){try{var t=indexedDB.open(Pe,Ze);t.onupgradeneeded=function(r){var a=r.target.result;a.objectStoreNames.contains("meta")&&r.oldVersion<2&&a.deleteObjectStore("meta"),a.objectStoreNames.contains("meta")||a.createObjectStore("meta",{keyPath:"key"}),a.objectStoreNames.contains("translations")||a.createObjectStore("translations",{keyPath:"lang"})},t.onsuccess=function(r){e(r.target.result)},t.onerror=function(){n(t.error)}}catch(r){n(r)}})}function oe(){return X().then(function(e){return new Promise(function(n,t){var r=e.transaction("meta","readonly"),a=r.objectStore("meta").get("registry");a.onsuccess=function(){e.close();var l=a.result;n(l?{languages:l.languages||[],languageNames:l.languageNames||{}}:null)},a.onerror=function(){e.close(),t(a.error)}})})}function Ie(e){var n="source:"+e;return X().then(function(t){return new Promise(function(r,a){var l=t.transaction("meta","readonly"),i=l.objectStore("meta").get(n);i.onsuccess=function(){t.close();var h=i.result;r(h?{url:h.url,timestamp:h.timestamp,storedAt:h.storedAt}:null)},i.onerror=function(){t.close(),a(i.error)}})})}function ze(e){return X().then(function(n){return new Promise(function(t,r){var a=n.transaction("translations","readonly"),l=a.objectStore("translations").get(e);l.onsuccess=function(){n.close();var i=l.result;t(i?i.data:null)},l.onerror=function(){n.close(),r(l.error)}})})}function Ye(){return X().then(function(e){return new Promise(function(n,t){var r=e.transaction(["meta","translations"],"readonly"),a=r.objectStore("meta"),l=a.get("registry");l.onsuccess=function(){var i=l.result;if(!i||!i.languages||i.languages.length===0){e.close(),n(null);return}var h=U(),g=h||i.languages[0],c=r.objectStore("translations").get(g);c.onsuccess=function(){e.close();var u=c.result;if(!u||!u.data){n(null);return}var d={};d[g]=u.data,n({languages:i.languages,languageNames:i.languageNames||{},translations:d})},c.onerror=function(){e.close(),t(c.error)}},l.onerror=function(){e.close(),t(l.error)}})})}function ie(e,n,t){var r=n.languages||[],a=n.languageNames||{},l=n.translations||{},i=n.timestamp||0;return X().then(function(h){return new Promise(function(g,c){var u=h.transaction(["meta","translations"],"readwrite"),d=u.objectStore("meta"),p=u.objectStore("translations"),f=d.get("registry");f.onsuccess=function(){var s=f.result,m,v;if(t&&s){var x=s.languages||[];m=x.slice();for(var y=0;y<r.length;y++)m.indexOf(r[y])===-1&&m.push(r[y]);v={};var b=s.languageNames||{},T;for(T in b)v[T]=b[T];for(T in a)v[T]=a[T]}else m=r,v=a;d.put({key:"registry",languages:m,languageNames:v}),d.put({key:"source:"+e,url:e,timestamp:i,storedAt:Date.now()});for(var S=0;S<r.length;S++)l[r[S]]&&(t&&Array.isArray(l[r[S]])?function(N){var K=p.get(N);K.onsuccess=function(){var O=K.result,Q=O&&Array.isArray(O.data)?O.data:null,W=l[N];if(Q){for(var Ke="\0",$={},de=[],V=0;V<Q.length;V++){var be=Q[V].key+Ke+(Q[V].context||"");$.hasOwnProperty(be)||de.push(be),$[be]=Q[V]}for(var q=0;q<W.length;q++){var Te=W[q].key+Ke+(W[q].context||"");$.hasOwnProperty(Te)||de.push(Te),$[Te]=W[q]}for(var Ue=[],we=0;we<de.length;we++)Ue.push($[de[we]]);p.put({lang:N,data:Ue})}else p.put({lang:N,data:W})}}(r[S]):p.put({lang:r[S],data:l[r[S]]}))},u.oncomplete=function(){h.close(),g()},u.onerror=function(){h.close(),c(u.error)}})})}function et(){return new Promise(function(e){var n=indexedDB.deleteDatabase(Pe);n.onsuccess=function(){e()},n.onerror=function(){e()},n.onblocked=function(){e()}})}var tt='<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><clipPath id="loco-wc"><circle cx="100" cy="100" r="90"/></clipPath></defs><circle cx="100" cy="100" r="90" fill="#1a1f2e"/><g clip-path="url(#loco-wc)"><g transform="translate(100,108) scale(0.72) translate(-334,-198)"><ellipse cx="310" cy="318" rx="10" ry="38" fill="#2ECC88" transform="rotate(-18 310 318)"/><ellipse cx="326" cy="326" rx="9" ry="42" fill="#34D99A" transform="rotate(-6 326 326)"/><ellipse cx="342" cy="328" rx="9" ry="42" fill="#7BC74A" transform="rotate(6 342 328)"/><ellipse cx="357" cy="320" rx="9" ry="36" fill="#F07040" transform="rotate(18 357 320)"/><ellipse cx="334" cy="240" rx="62" ry="80" fill="#2ECC88"/><ellipse cx="334" cy="252" rx="36" ry="52" fill="#D4F4B0"/><path d="M275 220 Q228 190 232 265 Q248 295 280 285 Q268 255 275 220Z" fill="#3A8FE0"/><path d="M277 225 Q238 208 240 262 Q252 285 278 277 Q268 252 277 225Z" fill="#6BB3FF" opacity="0.7"/><path d="M393 220 Q440 190 436 265 Q420 295 388 285 Q400 255 393 220Z" fill="#3A8FE0"/><path d="M391 225 Q430 208 428 262 Q416 285 390 277 Q400 252 391 225Z" fill="#6BB3FF" opacity="0.7"/><ellipse cx="334" cy="172" rx="38" ry="30" fill="#2ECC88"/><circle cx="334" cy="148" r="52" fill="#2ECC88"/><ellipse cx="334" cy="118" rx="30" ry="18" fill="#FFB833"/><circle cx="312" cy="138" r="14" fill="white"/><circle cx="315" cy="140" r="9" fill="#2C2C2A"/><circle cx="315" cy="140" r="4" fill="#04342C"/><circle cx="319" cy="136" r="3.5" fill="white"/><circle cx="356" cy="138" r="14" fill="white"/><circle cx="353" cy="140" r="9" fill="#2C2C2A"/><circle cx="353" cy="140" r="4" fill="#04342C"/><circle cx="357" cy="136" r="3.5" fill="white"/><path d="M326 155 Q334 144 342 155 Q342 170 334 173 Q326 170 326 155Z" fill="#E8A020"/><path d="M328 165 Q334 158 340 165 Q340 174 334 176 Q328 174 328 165Z" fill="#A06010"/><ellipse cx="302" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><ellipse cx="366" cy="152" rx="12" ry="8" fill="#F07040" opacity="0.8"/><path d="M320 100 Q316 68 308 52" stroke="#FFB833" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M334 97 Q334 64 334 46" stroke="#7BC74A" stroke-width="6" fill="none" stroke-linecap="round"/><path d="M348 100 Q352 68 360 52" stroke="#F07040" stroke-width="6" fill="none" stroke-linecap="round"/><circle cx="308" cy="50" r="8" fill="#FFB833"/><circle cx="334" cy="44" r="8" fill="#7BC74A"/><circle cx="360" cy="50" r="8" fill="#F07040"/><rect x="260" y="330" width="168" height="10" rx="5" fill="#8B5E20"/><path d="M310 330 L300 350 M310 330 L315 352 M310 330 L325 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M360 330 L350 350 M360 330 L365 352 M360 330 L375 348" stroke="#A07030" stroke-width="4" fill="none" stroke-linecap="round"/></g></g></svg>',xe=null;function le(e,n){xe=n;var t=document.getElementById("loco-lang-widget");t&&t.remove();var r={},a=e.map(function(s){return typeof s=="object"&&s.code?(s.name&&(r[s.code]=s.name),s.code):s});function l(s){return r[s]||s}var i=U()||null,h=document.createElement("div");h.id="loco-lang-widget",h.setAttribute("data-notranslate","");var g={"bottom-right":"bottom:20px;right:20px;","bottom-left":"bottom:20px;left:20px;","top-right":"top:20px;right:20px;","top-left":"top:20px;left:20px;"};h.style.cssText='position:fixed;z-index:2147483647;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;'+(g[n]||g["bottom-right"]);var c=document.createElement("button");c.innerHTML=tt,c.style.cssText="width:52px;height:52px;border-radius:50%;border:none;background:#1a1f2e;color:#fff;font-size:22px;cursor:pointer;box-shadow:0 4px 14px rgba(0,0,0,0.25);display:flex;align-items:center;justify-content:center;transition:transform 0.2s,box-shadow 0.2s;overflow:hidden;padding:0;",c.onmouseenter=function(){c.style.transform="scale(1.1)",c.style.boxShadow="0 6px 20px rgba(0,0,0,0.35)"},c.onmouseleave=function(){c.style.transform="scale(1)",c.style.boxShadow="0 4px 14px rgba(0,0,0,0.25)"};var u=document.createElement("div");u.style.cssText="display:none;position:absolute;"+(n.indexOf("bottom")===0?"bottom:56px;":"top:56px;")+(n.indexOf("right")>=0?"right:0;":"left:0;")+"background:#fff;border-radius:12px;box-shadow:0 8px 30px rgba(0,0,0,0.18);min-width:200px;max-height:320px;overflow-y:auto;padding:6px 0;";var d=document.createElement("div");d.textContent="Original",d.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;font-weight:600;border-bottom:1px solid #eee;",d.onmouseenter=function(){d.style.background="#f5f5f5"},d.onmouseleave=function(){d.style.background="transparent"},d.onclick=function(){i=null,window.Loco.restore(),f(),u.style.display="none"},u.appendChild(d);var p=[];a.forEach(function(s){var m=document.createElement("div");m.textContent=l(s),m.setAttribute("data-lang",s),m.style.cssText="padding:10px 16px;cursor:pointer;color:#333;transition:background 0.15s;",m.onmouseenter=function(){m.style.background="#f5f5f5"},m.onmouseleave=function(){m.style.background=i===s?"#e8f0fe":"transparent"},m.onclick=function(){i=s,window.Loco.apply(s),f(),u.style.display="none"},u.appendChild(m),p.push({el:m,code:s})});function f(){d.style.background=i===null?"#e8f0fe":"transparent",d.style.fontWeight=i===null?"600":"400",p.forEach(function(s){s.el.style.background=i===s.code?"#e8f0fe":"transparent",s.el.style.fontWeight=i===s.code?"600":"400"})}c.onclick=function(s){s.stopPropagation(),u.style.display=u.style.display==="none"?"block":"none"},document.addEventListener("click",function(s){h.contains(s.target)||(u.style.display="none")}),f(),h.appendChild(u),h.appendChild(c),document.body.appendChild(h)}function nt(e){xe&&(!e||e.length===0||le(e,xe))}var R={__proto__:1,constructor:1,prototype:1};function _e(e){if(!e||typeof e!="string")return!1;if(e.charAt(0)==="/"||e.charAt(0)===".")return!0;try{var n=new URL(e,window.location.origin);return n.protocol==="http:"||n.protocol==="https:"}catch{return!1}}function se(e){if(!e||typeof e!="object"||Array.isArray(e))return null;if(Array.isArray(e._raw)){for(var n={},t={},r=0;r<e._raw.length;r++){var a=e._raw[r];!a||typeof a.l!="string"||typeof a.k!="string"||typeof a.v!="string"||(n[a.l]||(n[a.l]=!0,t[a.l]=[]),t[a.l].push({key:a.k,context:typeof a.c=="string"?a.c:"",value:a.v}))}e={languages:Object.keys(n).sort(),languageNames:{},translations:t,timestamp:0}}var l={};if(!Array.isArray(e.languages))return null;l.languages=[];for(var i=0;i<e.languages.length;i++){if(typeof e.languages[i]!="string"||e.languages[i].length>20)return null;l.languages.push(e.languages[i])}if(l.timestamp=typeof e.timestamp=="number"&&isFinite(e.timestamp)?e.timestamp:0,l.languageNames={},e.languageNames&&typeof e.languageNames=="object"&&!Array.isArray(e.languageNames))for(var h in e.languageNames)!e.languageNames.hasOwnProperty(h)||R[h]||typeof e.languageNames[h]=="string"&&e.languageNames[h].length<=100&&(l.languageNames[h]=e.languageNames[h]);if(l.translations={},e.translations&&typeof e.translations=="object"&&!Array.isArray(e.translations)){for(var g in e.translations)if(!(!e.translations.hasOwnProperty(g)||R[g])&&l.languages.indexOf(g)!==-1){var c=e.translations[g];if(Array.isArray(c)){for(var u=[],d=0;d<c.length;d++){var p=c[d];!p||typeof p!="object"||typeof p.key!="string"||typeof p.value!="string"||p.key.length>G||p.value.length>G||R[p.key]||u.push({key:p.key,value:p.value,context:typeof p.context=="string"?p.context:""})}l.translations[g]=u}else if(typeof c=="object"){var f={};for(var s in c)!c.hasOwnProperty(s)||R[s]||typeof c[s]=="string"&&(s.length>G||c[s].length>G||(f[s]=c[s]));l.translations[g]=f}}}return l}async function Re(){try{var e=await fetch(o.apiBase+"/api/project/crawler-config",{headers:{"X-API-Key":o.apiKey}});e.ok&&Be(await e.json())}catch{}Ce(),o.phrases=await j(document.body),ne(o.phrases).then(function(t){t&&t.keyMap&&Y(o.phrases,t.keyMap)}).catch(function(t){console.warn("[loco] Failed to register keys:",t)}),!o.scanStopped&&o.screenshotsEnabled&&setTimeout(Ge,3e3),console.log("[loco] "+o.phrases.length+" text nodes discovered"),console.log(` Loco.textnodes() — list all discovered text nodes
|
|
2
2
|
Loco.apply("zh-Hans") — apply translations for a language
|
|
3
3
|
Loco.restore() — revert to original text
|
|
4
|
-
Loco.rescan() — re-scan DOM for new nodes`);var r=U();r?M.apply(r):i.observer=ae(i.phrases.map(function(t){return t.key+"\0"+(t.context||"")}),{})}function rt(e,r){for(var t="\0",n={},a=[],o=0;o<e.length;o++){var s=e[o],h=s.key+t+(s.context||"");n.hasOwnProperty(h)||a.push(h),n[h]=s}for(var m=0;m<r.length;m++){var c=r[m],u=c.key+t+(c.context||"");n.hasOwnProperty(u)||a.push(u),n[u]=c}for(var d=[],p=0;p<a.length;p++)d.push(n[a[p]]);return d}async function ce(e){i.screenshotsEnabled=!1,Ce(),i.phrases=await j(document.body);var r=[],t=i.fileData.translations||{},n=(i.fileData.languages||[])[0];n&&t[n]&&(t[n]=De(t[n]),r=Object.keys(t[n]));var a=R(i.phrases,r),o=a?Object.keys(a).length:0,s=(i.fileData.languages||[]).length;console.log("[loco] (file mode) "+i.phrases.length+" text nodes discovered, "+s+" language(s) available"+(o?", "+o+" var-remapped":"")+" ["+e+"]"),console.log(" Languages: "+(i.fileData.languages||[]).join(", "));var h=U();h?M.apply(h):i.observer=ae(i.phrases.map(function(m){return m.key+"\0"+(m.context||"")}),{})}async function Me(e){try{indexedDB.deleteDatabase("loco-translations")}catch{}try{indexedDB.deleteDatabase("loco-meta")}catch{}try{indexedDB.databases&&indexedDB.databases().then(function(t){t.forEach(function(n){if(n.name&&n.name.indexOf("loco-tr-")===0)try{indexedDB.deleteDatabase(n.name)}catch{}})}).catch(function(){})}catch{}i.fileUrls=e;var r=null;try{r=await Ye()}catch{}r&&r.translations?(i.fileData={languages:r.languages,languageNames:r.languageNames||{},translations:r.translations,timestamp:0},i.loadedFromCache=!0,await ce("cache"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null),it(e)):(await at(e),await ce("network"),i.fileReadyResolve&&(i.fileReadyResolve(),i.fileReadyResolve=null))}async function at(e){for(var r=e.map(function(m){return fetch(m).then(function(c){if(!c.ok)throw new Error("HTTP "+c.status+" for "+m);return c.text()}).then(function(c){if(!c||!c.trim())return null;var u;try{u=JSON.parse(c)}catch{return null}var d=le(u);return d?{url:m,data:d}:(console.warn("[loco] File rejected (invalid schema): "+m),null)}).catch(function(c){return console.warn("[loco] Failed to load "+m+":",c),null})}),t=await Promise.all(r),n=!0,a=0;a<t.length;a++)if(t[a]){var o=t[a].url,s=t[a].data,h=!n||(s.languages||[]).length===1;ue(s,n),n=!1;try{await oe(o,s,h)}catch{}}i.loadedFromCache=!1}function ue(e,r){if(!i.fileData||r){i.fileData={languages:(e.languages||[]).slice(),languageNames:Object.assign({},e.languageNames||{}),translations:Object.assign({},e.translations||{}),timestamp:e.timestamp||0};return}for(var t=e.languages||[],n=0;n<t.length;n++)i.fileData.languages.indexOf(t[n])===-1&&i.fileData.languages.push(t[n]);var a=e.languageNames||{};i.fileData.languageNames||(i.fileData.languageNames={});for(var o in a)!a.hasOwnProperty(o)||_[o]||(i.fileData.languageNames[o]=a[o]);var s=e.translations||{};i.fileData.translations||(i.fileData.translations={});for(var h in s)if(!(!s.hasOwnProperty(h)||_[h])){var m=i.fileData.translations[h],c=s[h];!m||!Array.isArray(m)||!Array.isArray(c)?i.fileData.translations[h]=c:i.fileData.translations[h]=rt(m,c)}e.timestamp&&e.timestamp>i.fileData.timestamp&&(i.fileData.timestamp=e.timestamp)}function it(e){var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){return n.ok?n.text():null}).catch(function(){return null})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return null;var s;try{s=JSON.parse(o)}catch{return null}if(s=le(s),!s)return null;var h=s.timestamp||0,m=a&&a.timestamp||0;if(h!==m){var c=e.length>1||(s.languages||[]).length===1;return oe(t,s,c).catch(function(){}),s}return null})});Promise.all(r).then(function(t){for(var n=!1,a=0;a<t.length;a++)t[a]&&(ue(t[a],!1),n=!0);n&&(i.loadedFromCache=!1,i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),ce("network — updated").then(function(){Ee()}),console.log("[loco] translations refreshed from file(s) (timestamp changed)"))}).catch(function(){console.log("[loco] using cached translations (network unavailable)")})}function Ee(){i.widgetPosition&&ie().then(function(e){if(e){var r=fe(e.languages,e.languageNames);nt(r)}}).catch(function(){})}function fe(e,r){return e=e||[],r=r||{},e.map(function(t){return r[t]?{code:t,name:r[t]}:t})}var M={version:"1.0.9",init:function(e){if(!e){console.warn("[loco] Loco.init() requires a config object");return}if(e.file||e.files){i.fileMode=!0,i.fileReady=new Promise(function(n){i.fileReadyResolve=n});for(var r=e.files?e.files.slice():[e.file],t=0;t<r.length;t++)if(!Re(r[t])){console.warn("[loco] Blocked unsafe URL: "+r[t]);return}i.fileUrl=r[0],document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){Me(r)}):Me(r);return}if(!e.apiKey){console.warn("[loco] Loco.init() requires { apiKey } or { file }");return}if(!e.apiUrl){console.warn("[loco] Loco.init() requires { apiUrl }");return}i.apiKey=e.apiKey,i.apiBase=e.apiUrl.replace(/\/+$/,""),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_e):_e()},apply:async function(e){if(!e){console.warn('[loco] Loco.apply() requires a language code, e.g. Loco.apply("zh-Hans")');return}if(typeof e!="string"||e.length>20||!/^[a-zA-Z0-9\-_]+$/.test(e)){console.warn("[loco] Invalid language code: "+e);return}if(i.fileMode){if(!i.fileData){console.warn("[loco] File not loaded yet. Call Loco.init({ file }) first.");return}if(!i.fileData.translations||!i.fileData.translations[e])try{var r=await ze(e);if(!r||Object.keys(r).length===0){console.warn('[loco] No translations for "'+e+'" in file data or cache');return}return i.fileData.translations||(i.fileData.translations={}),i.fileData.translations[e]=r,i.fileData.languages.indexOf(e)===-1&&i.fileData.languages.push(e),M.apply(e)}catch(o){console.warn('[loco] Failed to load translations for "'+e+'" from cache:',o);return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),i.translations=De(i.fileData.translations[e]),i.fileData.translations[e]=i.translations,i.phrases=await j(document.body);var t=Object.keys(i.translations);R(i.phrases,t);var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(o){return o.key+"\0"+(o.context||"")}),i.translations),J(e),console.log("[loco] (file) applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases);try{var a=await qe(e);i.translations=a||{},i.phrases=await j(document.body),R(i.phrases,Object.keys(i.translations)),ne(i.phrases).then(function(s){s&&s.keyMap&&(Y(i.phrases,s.keyMap),re(i.phrases,i.translations))}).catch(function(){});var n=await re(i.phrases,i.translations);return i.observer=ae(i.phrases.map(function(s){return s.key+"\0"+(s.context||"")}),i.translations),J(e),console.log("[loco] applied "+n.applied+" translation(s), "+n.skipped+" pending"),n}catch(o){console.warn("[loco] Failed to fetch translations:",o)}},restore:function(){C(i.phrases),i.observer&&i.observer.disconnect(),J(null)},rescan:async function(){var e=Object.keys(i.translations).length>0;e&&C(i.phrases),i.phrases=await j(document.body),i.fileMode||ne(i.phrases).catch(function(){}),e&&(R(i.phrases,Object.keys(i.translations)),await re(i.phrases,i.translations))},textnodes:function(){return i.phrases.map(function(e){return{key:e.key,context:e.context||"",element:e.element}})},stopScan:function(){i.scanStopped=!0,i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] scanning stopped, no further nodes will be sent to dashboard")},startScan:function(){i.scanStopped=!1,console.log("[loco] scanning resumed")},isFileMode:function(){return i.fileMode},languages:function(){if(i.fileMode){var e=function(){var r=i.fileData?i.fileData.languages||[]:[],t=i.fileData&&i.fileData.languageNames||{};return r.map(function(n){return{code:n,name:t[n]||n}})};return!i.fileData&&i.fileReady?i.fileReady.then(function(){return ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}):ie().then(function(r){return r&&r.languages&&r.languages.length>0?fe(r.languages,r.languageNames):e()}).catch(function(){return e()})}return!i.apiKey||!i.apiBase?Promise.resolve([]):fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(r){return r.json()}).then(function(r){return Array.isArray(r)?r:[]}).catch(function(){return[]})},widget:function(e){e=e||{};var r=e.position||"bottom-right";if(i.widgetPosition=r,i.fileMode){let t=function(){ie().then(function(a){var o;if(a&&a.languages&&a.languages.length>0?o=fe(a.languages,a.languageNames):o=n(),o.length===0){console.warn("[loco] No languages found in translation file or cache");return}se(o,r)}).catch(function(){var a=n();if(a.length===0){console.warn("[loco] No languages found in translation file");return}se(a,r)})},n=function(){var a=i.fileData?i.fileData.languages||[]:[],o=i.fileData&&i.fileData.languageNames||{};return a.map(function(s){return o[s]?{code:s,name:o[s]}:s})};if(!i.fileData&&i.fileReady){i.fileReady.then(t);return}t();return}if(!i.apiKey||!i.apiBase){console.warn("[loco] Call Loco.init() first");return}fetch(i.apiBase+"/api/languages",{headers:{"X-API-Key":i.apiKey}}).then(function(t){return t.json()}).then(function(t){if(!Array.isArray(t)||t.length===0){console.warn("[loco] No languages found — add translations in the dashboard first");return}se(t,r)}).catch(function(t){console.warn("[loco] Failed to fetch languages:",t)})},clearCache:function(){return i.fileMode?et().then(function(){i.fileData&&(i.fileData.translations={},i.fileData.timestamp=0),i.loadedFromCache=!1,J(null),C(i.phrases),i.observer&&(i.observer.disconnect(),i.observer=null),console.log("[loco] IndexedDB cache cleared — call pullLatest() to re-fetch")}).catch(function(e){console.warn("[loco] Failed to clear cache:",e)}):(console.warn("[loco] clearCache() is only available in file mode"),Promise.resolve())},addFile:function(e){return i.fileMode?e?Re(e)?(i.fileUrls.indexOf(e)===-1&&i.fileUrls.push(e),fetch(e).then(function(r){if(!r.ok)throw new Error("HTTP "+r.status);return r.text()}).then(function(r){if(!r||!r.trim())throw new Error("Empty file");var t;try{t=JSON.parse(r)}catch{throw new Error("Invalid JSON")}if(t=le(t),!t)throw new Error("Invalid file schema");var n=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,a=!n||(t.languages||[]).length===1;return ue(t,n),oe(e,t,a).catch(function(){}),Ee(),console.log("[loco] added file: "+e+" ("+(t.languages||[]).join(", ")+")"),{status:"added",languages:t.languages||[]}}).catch(function(r){return console.warn("[loco] addFile() failed:",r),{status:"error",reason:r.message}})):(console.warn("[loco] Blocked unsafe URL: "+e),Promise.resolve({status:"error",reason:"unsafe URL"})):Promise.resolve({status:"error",reason:"no URL provided"}):(console.warn("[loco] addFile() is only available in file mode"),Promise.resolve({status:"error",reason:"not in file mode"}))},pullLatest:function(){if(!i.fileMode)return console.warn("[loco] pullLatest() is only available in file mode"),Promise.resolve({status:"skipped",reason:"not in file mode"});var e=i.fileUrls.length>0?i.fileUrls:i.fileUrl?[i.fileUrl]:[];if(e.length===0)return console.warn("[loco] No file URL(s) configured. Call Loco.init({ file }) first."),Promise.resolve({status:"error",reason:"no file URLs"});var r=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(n){if(!n.ok)throw new Error("HTTP "+n.status);return n.text()})]).then(function(n){var a=n[0],o=n[1];if(!o||!o.trim())return{url:t,status:"current",reason:"empty"};var s;try{s=JSON.parse(o)}catch{throw new Error("Invalid JSON in "+t)}if(s=le(s),!s)throw new Error("Invalid file schema in "+t);var h=s.timestamp||0,m=a&&a.timestamp||0;if(h===m&&m!==0){var c=i.fileData&&i.fileData.translations,u=s.languages||[],d=!c||u.some(function(l){return!i.fileData.translations[l]});if(!d)return{url:t,status:"current",timestamp:m}}var p=!i.fileData||!i.fileData.languages||i.fileData.languages.length===0,f=!p||(s.languages||[]).length===1;return ue(s,p),oe(t,s,f).catch(function(){}),{url:t,status:"updated",timestamp:h,previousTimestamp:m}}).catch(function(n){return{url:t,status:"error",reason:n.message}})});return Promise.all(r).then(async function(t){var n=t.some(function(u){return u.status==="updated"});if(n){i.loadedFromCache=!1;var a=U();if(a)i.observer&&(i.observer.disconnect(),i.observer=null),C(i.phrases),await ce("pullLatest");else{i.phrases=Oe(document.body);var o=i.fileData.translations||{},s=(i.fileData.languages||[])[0];s&&o[s]&&R(i.phrases,Object.keys(o[s]))}Ee()}if(t.length===1){var h=t[0];return console.log("[loco] pullLatest: "+h.status+(h.timestamp?" (timestamp: "+h.timestamp+")":"")),h}var m=t.filter(function(u){return u.status==="updated"}).map(function(u){return u.url}),c=t.filter(function(u){return u.status==="current"}).map(function(u){return u.url});return console.log("[loco] pullLatest: "+m.length+" updated, "+c.length+" current"),{status:n?"updated":"current",results:t}}).catch(function(t){return console.warn("[loco] pullLatest() failed:",t),{status:"error",reason:t.message}})}};return window.Loco=M,Object.defineProperty(M,"_state",{value:i,writable:!1,enumerable:!1,configurable:!1}),M}();
|
|
4
|
+
Loco.rescan() — re-scan DOM for new nodes`);var n=U();n?M.apply(n):o.observer=ae(o.phrases.map(function(t){return t.key+"\0"+(t.context||"")}),{})}function rt(e,n){for(var t="\0",r={},a=[],l=0;l<e.length;l++){var i=e[l],h=i.key+t+(i.context||"");r.hasOwnProperty(h)||a.push(h),r[h]=i}for(var g=0;g<n.length;g++){var c=n[g],u=c.key+t+(c.context||"");r.hasOwnProperty(u)||a.push(u),r[u]=c}for(var d=[],p=0;p<a.length;p++)d.push(r[a[p]]);return d}async function ce(e){o.screenshotsEnabled=!1,Ce(),o.phrases=await j(document.body);var n=[],t=o.fileData.translations||{},r=(o.fileData.languages||[])[0];r&&t[r]&&(t[r]=De(t[r]),n=Object.keys(t[r]));var a=_(o.phrases,n),l=a?Object.keys(a).length:0,i=(o.fileData.languages||[]).length;console.log("[loco] (file mode) "+o.phrases.length+" text nodes discovered, "+i+" language(s) available"+(l?", "+l+" var-remapped":"")+" ["+e+"]"),console.log(" Languages: "+(o.fileData.languages||[]).join(", "));var h=U();h?M.apply(h):o.observer=ae(o.phrases.map(function(g){return g.key+"\0"+(g.context||"")}),{})}async function Me(e){try{indexedDB.deleteDatabase("loco-translations")}catch{}try{indexedDB.deleteDatabase("loco-meta")}catch{}try{indexedDB.databases&&indexedDB.databases().then(function(t){t.forEach(function(r){if(r.name&&r.name.indexOf("loco-tr-")===0)try{indexedDB.deleteDatabase(r.name)}catch{}})}).catch(function(){})}catch{}o.fileUrls=e;var n=null;try{n=await Ye()}catch{}n&&n.translations?(o.fileData={languages:n.languages,languageNames:n.languageNames||{},translations:n.translations,timestamp:0},o.loadedFromCache=!0,await ce("cache"),o.fileReadyResolve&&(o.fileReadyResolve(),o.fileReadyResolve=null),ot(e)):(await at(e),await ce("network"),o.fileReadyResolve&&(o.fileReadyResolve(),o.fileReadyResolve=null))}async function at(e){for(var n=e.map(function(g){return fetch(g).then(function(c){if(!c.ok)throw new Error("HTTP "+c.status+" for "+g);return c.text()}).then(function(c){if(!c||!c.trim())return null;var u;try{u=JSON.parse(c)}catch{return null}var d=se(u);return d?{url:g,data:d}:(console.warn("[loco] File rejected (invalid schema): "+g),null)}).catch(function(c){return console.warn("[loco] Failed to load "+g+":",c),null})}),t=await Promise.all(n),r=!0,a=0;a<t.length;a++)if(t[a]){var l=t[a].url,i=t[a].data,h=!r||(i.languages||[]).length===1;ue(i,r),r=!1;try{await ie(l,i,h)}catch{}}o.loadedFromCache=!1}function ue(e,n){if(!o.fileData||n){o.fileData={languages:(e.languages||[]).slice(),languageNames:Object.assign({},e.languageNames||{}),translations:Object.assign({},e.translations||{}),timestamp:e.timestamp||0};return}for(var t=e.languages||[],r=0;r<t.length;r++)o.fileData.languages.indexOf(t[r])===-1&&o.fileData.languages.push(t[r]);var a=e.languageNames||{};o.fileData.languageNames||(o.fileData.languageNames={});for(var l in a)!a.hasOwnProperty(l)||R[l]||(o.fileData.languageNames[l]=a[l]);var i=e.translations||{};o.fileData.translations||(o.fileData.translations={});for(var h in i)if(!(!i.hasOwnProperty(h)||R[h])){var g=o.fileData.translations[h],c=i[h];!g||!Array.isArray(g)||!Array.isArray(c)?o.fileData.translations[h]=c:o.fileData.translations[h]=rt(g,c)}e.timestamp&&e.timestamp>o.fileData.timestamp&&(o.fileData.timestamp=e.timestamp)}function ot(e){var n=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(r){return r.ok?r.text():null}).catch(function(){return null})]).then(function(r){var a=r[0],l=r[1];if(!l||!l.trim())return null;var i;try{i=JSON.parse(l)}catch{return null}if(i=se(i),!i)return null;var h=i.timestamp||0,g=a&&a.timestamp||0;if(h!==g){var c=e.length>1||(i.languages||[]).length===1;return ie(t,i,c).catch(function(){}),i}return null})});Promise.all(n).then(function(t){for(var r=!1,a=0;a<t.length;a++)t[a]&&(ue(t[a],!1),r=!0);r&&(o.loadedFromCache=!1,o.observer&&(o.observer.disconnect(),o.observer=null),C(o.phrases),ce("network — updated").then(function(){Ee()}),console.log("[loco] translations refreshed from file(s) (timestamp changed)"))}).catch(function(){console.log("[loco] using cached translations (network unavailable)")})}function Ee(){o.widgetPosition&&oe().then(function(e){if(e){var n=fe(e.languages,e.languageNames);nt(n)}}).catch(function(){})}function fe(e,n){return e=e||[],n=n||{},e.map(function(t){return n[t]?{code:t,name:n[t]}:t})}var M={version:"1.0.10",init:function(e){if(!e){console.warn("[loco] Loco.init() requires a config object");return}if(e.file||e.files){o.fileMode=!0,o.fileReady=new Promise(function(r){o.fileReadyResolve=r});for(var n=e.files?e.files.slice():[e.file],t=0;t<n.length;t++)if(!_e(n[t])){console.warn("[loco] Blocked unsafe URL: "+n[t]);return}o.fileUrl=n[0],document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){Me(n)}):Me(n);return}if(!e.apiKey){console.warn("[loco] Loco.init() requires { apiKey } or { file }");return}if(!e.apiUrl){console.warn("[loco] Loco.init() requires { apiUrl }");return}o.apiKey=e.apiKey,o.apiBase=e.apiUrl.replace(/\/+$/,""),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Re):Re()},apply:async function(e){var n=typeof window<"u"&&window.__locoPerfMode;if(n&&(performance.clearMarks(),performance.clearMeasures(),performance.mark("loco-apply-start")),!e){console.warn('[loco] Loco.apply() requires a language code, e.g. Loco.apply("zh-Hans")');return}if(typeof e!="string"||e.length>20||!/^[a-zA-Z0-9\-_]+$/.test(e)){console.warn("[loco] Invalid language code: "+e);return}if(o.fileMode){if(!o.fileData){console.warn("[loco] File not loaded yet. Call Loco.init({ file }) first.");return}if(!o.fileData.translations||!o.fileData.translations[e])try{var t=await ze(e);if(!t||Object.keys(t).length===0){console.warn('[loco] No translations for "'+e+'" in file data or cache');return}return o.fileData.translations||(o.fileData.translations={}),o.fileData.translations[e]=t,o.fileData.languages.indexOf(e)===-1&&o.fileData.languages.push(e),M.apply(e)}catch(i){console.warn('[loco] Failed to load translations for "'+e+'" from cache:',i);return}o.observer&&(o.observer.disconnect(),o.observer=null),C(o.phrases),o.translations=De(o.fileData.translations[e]),o.fileData.translations[e]=o.translations,n&&performance.mark("loco-collect-start"),o.phrases=await j(document.body),n&&(performance.mark("loco-collect-end"),performance.measure("loco-collection-time","loco-collect-start","loco-collect-end"));var r=Object.keys(o.translations);_(o.phrases,r),n&&performance.mark("loco-dom-start");var a=await re(o.phrases,o.translations);return n&&(performance.mark("loco-dom-end"),performance.measure("loco-dom-write-time","loco-dom-start","loco-dom-end"),performance.measure("loco-apply-total","loco-apply-start","loco-dom-end")),o.observer=ae(o.phrases.map(function(i){return i.key+"\0"+(i.context||"")}),o.translations),J(e),console.log("[loco] (file) applied "+a.applied+" translation(s), "+a.skipped+" pending"),a}if(!o.apiKey||!o.apiBase){console.warn("[loco] Call Loco.init() first");return}o.observer&&(o.observer.disconnect(),o.observer=null),C(o.phrases);try{var l=await qe(e);o.translations=l||{},n&&performance.mark("loco-collect-start"),o.phrases=await j(document.body),n&&(performance.mark("loco-collect-end"),performance.measure("loco-collection-time","loco-collect-start","loco-collect-end")),_(o.phrases,Object.keys(o.translations)),ne(o.phrases).then(function(h){h&&h.keyMap&&(Y(o.phrases,h.keyMap),re(o.phrases,o.translations))}).catch(function(){}),n&&performance.mark("loco-dom-start");var a=await re(o.phrases,o.translations);return n&&(performance.mark("loco-dom-end"),performance.measure("loco-dom-write-time","loco-dom-start","loco-dom-end"),performance.measure("loco-apply-total","loco-apply-start","loco-dom-end")),o.observer=ae(o.phrases.map(function(h){return h.key+"\0"+(h.context||"")}),o.translations),J(e),console.log("[loco] applied "+a.applied+" translation(s), "+a.skipped+" pending"),a}catch(i){console.warn("[loco] Failed to fetch translations:",i)}},restore:function(){C(o.phrases),o.observer&&o.observer.disconnect(),J(null)},rescan:async function(){var e=Object.keys(o.translations).length>0;e&&C(o.phrases),o.phrases=await j(document.body),o.fileMode||ne(o.phrases).catch(function(){}),e&&(_(o.phrases,Object.keys(o.translations)),await re(o.phrases,o.translations))},textnodes:function(){return o.phrases.map(function(e){return{key:e.key,context:e.context||"",element:e.element}})},stopScan:function(){o.scanStopped=!0,o.observer&&(o.observer.disconnect(),o.observer=null),console.log("[loco] scanning stopped, no further nodes will be sent to dashboard")},startScan:function(){o.scanStopped=!1,console.log("[loco] scanning resumed")},isFileMode:function(){return o.fileMode},languages:function(){if(o.fileMode){var e=function(){var n=o.fileData?o.fileData.languages||[]:[],t=o.fileData&&o.fileData.languageNames||{};return n.map(function(r){return{code:r,name:t[r]||r}})};return!o.fileData&&o.fileReady?o.fileReady.then(function(){return oe().then(function(n){return n&&n.languages&&n.languages.length>0?fe(n.languages,n.languageNames):e()}).catch(function(){return e()})}):oe().then(function(n){return n&&n.languages&&n.languages.length>0?fe(n.languages,n.languageNames):e()}).catch(function(){return e()})}return!o.apiKey||!o.apiBase?Promise.resolve([]):fetch(o.apiBase+"/api/languages",{headers:{"X-API-Key":o.apiKey}}).then(function(n){return n.json()}).then(function(n){return Array.isArray(n)?n:[]}).catch(function(){return[]})},widget:function(e){e=e||{};var n=e.position||"bottom-right";if(o.widgetPosition=n,o.fileMode){let t=function(){oe().then(function(a){var l;if(a&&a.languages&&a.languages.length>0?l=fe(a.languages,a.languageNames):l=r(),l.length===0){console.warn("[loco] No languages found in translation file or cache");return}le(l,n)}).catch(function(){var a=r();if(a.length===0){console.warn("[loco] No languages found in translation file");return}le(a,n)})},r=function(){var a=o.fileData?o.fileData.languages||[]:[],l=o.fileData&&o.fileData.languageNames||{};return a.map(function(i){return l[i]?{code:i,name:l[i]}:i})};if(!o.fileData&&o.fileReady){o.fileReady.then(t);return}t();return}if(!o.apiKey||!o.apiBase){console.warn("[loco] Call Loco.init() first");return}fetch(o.apiBase+"/api/languages",{headers:{"X-API-Key":o.apiKey}}).then(function(t){return t.json()}).then(function(t){if(!Array.isArray(t)||t.length===0){console.warn("[loco] No languages found — add translations in the dashboard first");return}le(t,n)}).catch(function(t){console.warn("[loco] Failed to fetch languages:",t)})},clearCache:function(){return o.fileMode?et().then(function(){o.fileData&&(o.fileData.translations={},o.fileData.timestamp=0),o.loadedFromCache=!1,J(null),C(o.phrases),o.observer&&(o.observer.disconnect(),o.observer=null),console.log("[loco] IndexedDB cache cleared — call pullLatest() to re-fetch")}).catch(function(e){console.warn("[loco] Failed to clear cache:",e)}):(console.warn("[loco] clearCache() is only available in file mode"),Promise.resolve())},addFile:function(e){return o.fileMode?e?_e(e)?(o.fileUrls.indexOf(e)===-1&&o.fileUrls.push(e),fetch(e).then(function(n){if(!n.ok)throw new Error("HTTP "+n.status);return n.text()}).then(function(n){if(!n||!n.trim())throw new Error("Empty file");var t;try{t=JSON.parse(n)}catch{throw new Error("Invalid JSON")}if(t=se(t),!t)throw new Error("Invalid file schema");var r=!o.fileData||!o.fileData.languages||o.fileData.languages.length===0,a=!r||(t.languages||[]).length===1;return ue(t,r),ie(e,t,a).catch(function(){}),Ee(),console.log("[loco] added file: "+e+" ("+(t.languages||[]).join(", ")+")"),{status:"added",languages:t.languages||[]}}).catch(function(n){return console.warn("[loco] addFile() failed:",n),{status:"error",reason:n.message}})):(console.warn("[loco] Blocked unsafe URL: "+e),Promise.resolve({status:"error",reason:"unsafe URL"})):Promise.resolve({status:"error",reason:"no URL provided"}):(console.warn("[loco] addFile() is only available in file mode"),Promise.resolve({status:"error",reason:"not in file mode"}))},pullLatest:function(){if(!o.fileMode)return console.warn("[loco] pullLatest() is only available in file mode"),Promise.resolve({status:"skipped",reason:"not in file mode"});var e=o.fileUrls.length>0?o.fileUrls:o.fileUrl?[o.fileUrl]:[];if(e.length===0)return console.warn("[loco] No file URL(s) configured. Call Loco.init({ file }) first."),Promise.resolve({status:"error",reason:"no file URLs"});var n=e.map(function(t){return Promise.all([Ie(t).catch(function(){return null}),fetch(t).then(function(r){if(!r.ok)throw new Error("HTTP "+r.status);return r.text()})]).then(function(r){var a=r[0],l=r[1];if(!l||!l.trim())return{url:t,status:"current",reason:"empty"};var i;try{i=JSON.parse(l)}catch{throw new Error("Invalid JSON in "+t)}if(i=se(i),!i)throw new Error("Invalid file schema in "+t);var h=i.timestamp||0,g=a&&a.timestamp||0;if(h===g&&g!==0){var c=o.fileData&&o.fileData.translations,u=i.languages||[],d=!c||u.some(function(s){return!o.fileData.translations[s]});if(!d)return{url:t,status:"current",timestamp:g}}var p=!o.fileData||!o.fileData.languages||o.fileData.languages.length===0,f=!p||(i.languages||[]).length===1;return ue(i,p),ie(t,i,f).catch(function(){}),{url:t,status:"updated",timestamp:h,previousTimestamp:g}}).catch(function(r){return{url:t,status:"error",reason:r.message}})});return Promise.all(n).then(async function(t){var r=t.some(function(u){return u.status==="updated"});if(r){o.loadedFromCache=!1;var a=U();if(a)o.observer&&(o.observer.disconnect(),o.observer=null),C(o.phrases),await ce("pullLatest");else{o.phrases=Oe(document.body);var l=o.fileData.translations||{},i=(o.fileData.languages||[])[0];i&&l[i]&&_(o.phrases,Object.keys(l[i]))}Ee()}if(t.length===1){var h=t[0];return console.log("[loco] pullLatest: "+h.status+(h.timestamp?" (timestamp: "+h.timestamp+")":"")),h}var g=t.filter(function(u){return u.status==="updated"}).map(function(u){return u.url}),c=t.filter(function(u){return u.status==="current"}).map(function(u){return u.url});return console.log("[loco] pullLatest: "+g.length+" updated, "+c.length+" current"),{status:r?"updated":"current",results:t}}).catch(function(t){return console.warn("[loco] pullLatest() failed:",t),{status:"error",reason:t.message}})}};return window.Loco=M,Object.defineProperty(M,"_state",{value:o,writable:!1,enumerable:!1,configurable:!1}),M}();
|
package/versions.json
CHANGED