var re_num = /^[.\d]+$/; var re_emoji = /[\p{Extended_Pictographic}\u{1F3FB}-\u{1F3FF}\u{1F9B0}-\u{1F9B3}]/u; var original_lines = {}; var translated_lines = {}; function hasLocalization() { return window.localization && Object.keys(window.localization).length > 0; } function textNodesUnder(el) { var n, a = [], walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false); while ((n = walk.nextNode())) a.push(n); return a; } function canBeTranslated(node, text) { if (!text) return false; if (!node.parentElement) return false; var parentType = node.parentElement.nodeName; if (parentType == 'SCRIPT' || parentType == 'STYLE' || parentType == 'TEXTAREA') return false; if (parentType == 'OPTION' || parentType == 'SPAN') { var pnode = node; for (var level = 0; level < 4; level++) { pnode = pnode.parentElement; if (!pnode) break; } } if (re_num.test(text)) return false; if (re_emoji.test(text)) return false; return true; } function getTranslation(text) { if (!text) return undefined; if (translated_lines[text] === undefined) { original_lines[text] = 1; } var tl = localization[text]; if (tl !== undefined) { translated_lines[tl] = 1; } return tl; } function processTextNode(node) { var text = node.textContent.trim(); if (!canBeTranslated(node, text)) return; var tl = getTranslation(text); if (tl !== undefined) { node.textContent = tl; } } function processNode(node) { console.log(node.nodeType + " " + node.nodeName + " " + node.nodeValue) if (node.nodeType == 3) { processTextNode(node); return; } if (node.title) { let tl = getTranslation(node.title); if (tl !== undefined) { node.title = tl; } } if (node.placeholder) { let tl = getTranslation(node.placeholder); if (tl !== undefined) { node.placeholder = tl; } } textNodesUnder(node).forEach(function(node) { processTextNode(node); }); } document.addEventListener("DOMContentLoaded", function() { if (!hasLocalization()) { return; } onUiUpdate(function(m) { m.forEach(function(mutation) { mutation.addedNodes.forEach(function(node) { processNode(node); }); }); }); processNode(gradioApp()); });