1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" /> 6 <title>XLERT.ai</title> 7 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 8 <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/lipis/[email protected]/css/flag-icons.min.css" /> 9
9<script type="module" crossorigin src="/assets/index-Dn21XYDh.js"></script>
9 10 <link rel="stylesheet" crossorigin href="/assets/index-Cmalz6qJ.css"> 11 </head> 12 <body> 13 <div id="root"></div> 14
14<script> 15 (function() { 16 var translationCache = {}; 17 var currentLang = ''; 18 var originalTexts = new Map(); 19 var isTranslating = false; 20 21 async function translateBatch(texts, targetLang) { 22 var cacheKey = targetLang + '::' + texts.join('|||'); 23 if (translationCache[cacheKey]) return translationCache[cacheKey]; 24 try { 25 var res = await fetch('/api/translate', { 26 method: 'POST', 27 headers: { 'Content-Type': 'application/json' }, 28 body: JSON.stringify({ texts: texts, target: targetLang }) 29 }); 30 var data = await res.json(); 31 if (data.translations) { 32 translationCache[cacheKey] = data.translations; 33 return data.translations; 34 } 35 } catch(e) { console.error('Translation error:', e); } 36 return texts; 37 } 38 39 function getTextNodes(root) { 40 var nodes = []; 41 var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { 42 acceptNode: function(node) { 43 if (!node.textContent || !node.textContent.trim()) return NodeFilter.FILTER_REJECT; 44 var parent = node.parentElement; 45 if (!parent) return NodeFilter.FILTER_REJECT; 46 var tag = parent.tagName; 47 if (tag === 'SCRIPT' || tag === 'STYLE' || tag === 'NOSCRIPT' || tag === 'CODE' || tag === 'PRE') return NodeFilter.FILTER_REJECT; 48 if (parent.closest('[data-notranslate]') || parent.closest('.notranslate')) return NodeFilter.FILTER_REJECT; 49 if (node.textContent.trim().length < 2) return NodeFilter.FILTER_REJECT; 50 if (/^[\d\s\.\,\$\%\@\#\!\?\-\+\=\*\/\\\|\&\^\~\`\;\:\'\"\(\)\[\]\{\}<>]+$/.test(node.textContent.trim())) return NodeFilter.FILTER_REJECT; 51 return NodeFilter.FILTER_ACCEPT; 52 } 53 }); 54 while (walker.nextNode()) nodes.push(walker.currentNode); 55 return nodes; 56 } 57 58 async function translatePage(langCode) { 59 if (isTranslating) return; 60 isTranslating = true; 61 currentLang = langCode; 62 63 if (langCode === 'en' || langCode === '') {
64 originalTexts.forEach(function(original, node) { 65 if (node.parentElement) node.textContent = original; 66 }); 67 originalTexts.clear(); 68 isTranslating = false; 69 return; 70 } 71 72 var root = document.getElementById('root'); 73 if (!root) { isTranslating = false; return; } 74 75 if (originalTexts.size > 0) { 76 originalTexts.forEach(function(original, node) { 77 if (node.parentElement) node.textContent = original; 78 }); 79 originalTexts.clear(); 80 } 81 82 var textNodes = getTextNodes(root); 83 var texts = []; 84 var nodeMap = []; 85 86 for (var i = 0; i < textNodes.length; i++) { 87 var txt = textNodes[i].textContent.trim(); 88 if (txt && !originalTexts.has(textNodes[i])) { 89 originalTexts.set(textNodes[i], textNodes[i].textContent); 90 texts.push(txt); 91 nodeMap.push(textNodes[i]); 92 } 93 } 94 95 var batchSize = 50; 96 for (var b = 0; b < texts.length; b += batchSize) { 97 if (currentLang !== langCode) break; 98 var batch = texts.slice(b, b + batchSize); 99 var batchNodes = nodeMap.slice(b, b + batchSize); 100 var translated = await translateBatch(batch, langCode); 101 for (var j = 0; j < translated.length; j++) { 102 if (batchNodes[j].parentElement && currentLang === langCode) { 103 batchNodes[j].textContent = translated[j]; 104 } 105 } 106 } 107 isTranslating = false; 108 } 109 110 window._setGoogleTranslateLanguage = function(langCode) { 111 translatePage(langCode); 112 }; 113 })(); 114 </script>
114 115 </body> 116</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.