PageSourceSearch

https://xlert.ai/

html xlert.ai collected 2026-10-05 15:15:34 UTC 4,605 bytes, 116 lines download raw bytes

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.