Translate page progressively - parallel chunks, swap text as each batch returns

This commit is contained in:
martbost
2026-08-21 07:40:07 -05:00
parent 0a1f779305
commit d35034306a
+13 -12
View File
@@ -49,22 +49,23 @@
var uniq=[],idx={};
nodes.forEach(function(n){ var t=n.nodeValue.trim(); if(!(t in idx)&&memo[t]==null){ idx[t]=uniq.length; uniq.push(t);} });
var chunks=[]; for(var i=0;i<uniq.length;i+=20)chunks.push(uniq.slice(i,i+20));
var p=Promise.resolve();
chunks.forEach(function(ch){
p=p.then(function(){
return fetch('/api/public/translate',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({tl:lang,texts:ch})}).then(function(r){return r.json()}).then(function(d){
if(d&&Array.isArray(d.t))ch.forEach(function(t,j){ memo[t]=d.t[j]; });
}).catch(function(){});
});
});
p.then(function(){
saveMemo();
function apply(){
nodes.forEach(function(n){
var raw=n.nodeValue,t=raw.trim(),tr=memo[t];
if(tr&&tr!==t){ n.nodeValue=raw.replace(t,tr); }
n.__rmcTr=lang;
});
}
apply(); // whatever the memo already covers shows instantly
// parallel chunks, each swapped in the moment it returns — a first-ever
// page+language visit translates progressively instead of all-at-the-end
Promise.all(chunks.map(function(ch){
return fetch('/api/public/translate',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({tl:lang,texts:ch})}).then(function(r){return r.json()}).then(function(d){
if(d&&Array.isArray(d.t)){ ch.forEach(function(t,j){ memo[t]=d.t[j]; }); apply(); }
}).catch(function(){});
})).then(function(){
saveMemo();
nodes.forEach(function(n){ n.__rmcTr=lang; });
busy=false;
if(queued){queued=false;translatePage();}
});