@react-lib-tech/multi-lang-renderer
Version:
A tiny React component library (JS)
1 lines • 47.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.js","../src/utils/TranslationContext.jsx","../src/utils/GoogleTranslate.jsx"],"sourcesContent":["export {\n TranslationProvider,\n useTranslation,\n} from \"./utils/TranslationContext.jsx\";\nexport { GoogleTranslate } from \"./utils/GoogleTranslate.jsx\";","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, {\n createContext,\n useState,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useCallback,\n} from \"react\";\nexport const TranslationContext = createContext(null);\n\nconst numberLikeRe = /^[\\s\\d.,:+/-]+$/;\nconst isNumberLike = (str) => str !== \"\" && numberLikeRe.test(str);\n\nconst defaultSpecials = [\"–\", \"-\", \"!\", \"?\", \"@\", \"#\"];\n\nconst toObjectMap = (arr = []) => {\n const map = {};\n arr.forEach((item) => {\n const [key, value] = Object.entries(item)[0] || [];\n if (key) map[key] = value;\n });\n return map;\n};\n\nconst raf =\n typeof requestAnimationFrame !== \"undefined\"\n ? requestAnimationFrame\n : (cb) => setTimeout(cb, 16);\n\nfunction compressElements(elements) {\n const arr = Array.from(elements);\n const out = [];\n for (let i = 0; i < arr.length; i++) {\n let keep = true;\n let node = arr[i].parentElement;\n while (node) {\n if (elements.has(node)) {\n keep = false;\n break;\n }\n node = node.parentElement;\n }\n if (keep) out.push(arr[i]);\n }\n return out;\n}\n\n// --- helpers for text handling ---\n\nconst CONTAINER_TAGS = [\n \"button\",\n \"div\",\n \"span\",\n \"p\",\n \"b\",\n \"a\",\n \"strong\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"label\",\n \"input\",\n \"textarea\",\n \"select\",\n \"option\",\n \"table\",\n \"th\",\n \"td\",\n \"form\",\n \"header\",\n \"footer\",\n \"section\",\n \"article\",\n \"aside\",\n \"nav\",\n];\n\nconst CONTAINER_SELECTOR = CONTAINER_TAGS.join(\",\");\n\nfunction normalizeText(str = \"\") {\n return String(str).replace(/\\s+/g, \" \").trim();\n}\nfunction containsHTML(s = \"\") {\n return /<[^>]+>/.test(s);\n}\nfunction preserveWhitespace(origText = \"\", core = \"\") {\n const m = origText.match(/^(\\s*)([\\s\\S]*?)(\\s*)$/);\n const leading = (m && m[1]) || \"\";\n const trailing = (m && m[3]) || \"\";\n return leading + (core || \"\") + trailing;\n}\n\nexport const TranslationProvider = ({\n children,\n JSONData = [],\n lang = \"en\",\n extraTags = [],\n extraSpecialChars = [],\n attributes = [\"title\", \"placeholder\"],\n debug = false,\n onScan, // { allTexts, newTexts }\n onKeysChange, // { added, removed, changed }\n onMutation = null, // optional callback receives detailed mutation infos\n}) => {\n const [language, setLanguage] = useState(lang);\n const [translations, setTranslations] = useState({});\n const [keySet, setKeySet] = useState(new Set());\n\n const translationsRef = useRef(translations);\n const prevTranslationsRef = useRef(translations);\n const keySetRef = useRef(keySet);\n const specialsRef = useRef([...defaultSpecials, ...extraSpecialChars]);\n const isTranslatingRef = useRef(false);\n const processedThisTick = useRef(new WeakSet());\n const seenTextsRef = useRef(new Set());\n\n useEffect(() => {\n translationsRef.current = translations;\n }, [translations]);\n\n useEffect(() => {\n keySetRef.current = keySet;\n }, [keySet]);\n\n useEffect(() => {\n specialsRef.current = [...defaultSpecials, ...extraSpecialChars];\n }, [extraSpecialChars]);\n\n useEffect(() => {\n setLanguage(lang);\n if (typeof document !== \"undefined\") {\n document.body.setAttribute(\"lang\", lang);\n }\n }, [lang]);\n\n useEffect(() => {\n const obj = toObjectMap(JSONData);\n setTranslations(obj);\n }, [JSONData]);\n\n useEffect(() => {\n const s = new Set(Object.keys(translations || {}));\n setKeySet(s);\n }, [translations]);\n\n const translate = useCallback((key) => {\n if (!key) return \"\";\n return translationsRef.current[key] ?? key;\n }, []);\n\n const isSpecial = useCallback((str) => {\n return specialsRef.current.some((char) => str.includes(char));\n }, []);\n\n const translateElementAttributes = useCallback(\n (el) => {\n attributes.forEach((attr) => {\n try {\n if (el.hasAttribute && el.hasAttribute(attr)) {\n let key = el.getAttribute(\"data-lang\") || el.getAttribute(attr);\n\n if (!el.hasAttribute(\"data-lang\") && key) {\n el.setAttribute(\"data-lang\", key);\n }\n\n if (!key && keySetRef.current.has(key)) {\n el.setAttribute(\"data-lang\", key);\n }\n\n const translated = translate(key || \"\") || key;\n\n if (el.getAttribute(attr) !== translated) {\n el.setAttribute(attr, translated || \"\");\n }\n }\n } catch (e) {\n if (debug) console.warn(\"translateElementAttributes error\", e);\n }\n });\n },\n [translate, attributes, debug]\n );\n\n // --- main translateTextNodes ---\n const translateTextNodes = useCallback(\n (rootEl) => {\n if (!rootEl || processedThisTick.current.has(rootEl)) return;\n processedThisTick.current.add(rootEl);\n translateElementAttributes(rootEl);\n const walker = document.createTreeWalker(rootEl, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const t = (node.textContent || \"\").trim();\n return t ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n\n let node;\n const processedContainers = new Map();\n while ((node = walker.nextNode())) {\n const textNode = node;\n const parent = textNode.parentElement;\n\n if (!parent) continue;\n if (!textNode.isConnected || !parent.isConnected) continue;\n\n const container =\n (parent.closest && parent.closest(CONTAINER_SELECTOR)) || parent;\n const fullText = normalizeText(container.textContent || \"\");\n if (processedContainers.get(container) === fullText) continue;\n processedContainers.set(container, fullText);\n\n if (!fullText) continue;\n if (isNumberLike(fullText)) continue;\n\n let keyToUse = container.getAttribute(\"data-lang\");\n if (keySet.has(fullText)) {\n container.setAttribute(\"data-lang\", fullText);\n keyToUse = fullText;\n }\n\n if (!seenTextsRef.current.has(fullText)) {\n seenTextsRef.current.add(fullText);\n onScan?.({\n allTexts: Array.from(seenTextsRef.current),\n newTexts: [fullText],\n });\n }\n\n const translatedFull = translate(keyToUse || fullText) || fullText;\n if (container.dataset.translated === translatedFull) continue;\n if (!translatedFull) continue;\n if (normalizeText(translatedFull) === fullText) {\n if (container.dataset.translated) delete container.dataset.translated;\n continue;\n }\n\n try {\n if (containsHTML(translatedFull)) {\n container.innerHTML = translatedFull;\n container.dataset.translated = translatedFull;\n const data = document.querySelectorAll(`data-lang[${keyToUse}]`);\n console.log(data, \"asjdhaskdjashdjkasdsh\");\n continue;\n }\n\n let leaves = [];\n const w2 = document.createTreeWalker(\n container,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode(n) {\n const t = (n.textContent || \"\").trim();\n return t ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n let ln;\n while ((ln = w2.nextNode())) leaves.push(ln);\n if (leaves.length === 0) {\n container.textContent = translatedFull;\n container.dataset.translated = translatedFull;\n continue;\n }\n\n if (leaves.length === 1) {\n const orig = leaves[0].textContent || \"\";\n const core = normalizeText(translatedFull);\n leaves[0].nodeValue = preserveWhitespace(orig, core);\n container.dataset.translated = translatedFull;\n continue;\n }\n container.textContent = translatedFull;\n container.dataset.translated = translatedFull;\n } catch (err) {\n if (debug) console.error(\"translateTextNodes error\", err);\n try {\n const first = container.firstChild;\n if (first && first.nodeType === Node.TEXT_NODE) {\n first.nodeValue = normalizeText(translatedFull);\n container.dataset.translated = translatedFull;\n }\n } catch (e) { }\n }\n }\n },\n [\n translateElementAttributes,\n translate,\n isSpecial,\n isNumberLike,\n debug,\n onScan,\n ]\n );\n\n // initial scan\n const initialScan = useCallback(() => {\n if (typeof document === \"undefined\") return;\n\n const targeted = document.querySelectorAll(\n \"[data-lang], [title], [placeholder]\"\n );\n const tags = Array.from(new Set([...CONTAINER_TAGS, ...extraTags]));\n const broad = document.querySelectorAll(tags.join(\",\"));\n\n raf(() => {\n isTranslatingRef.current = true;\n processedThisTick.current = new WeakSet();\n targeted.forEach((el) => translateTextNodes(el));\n broad.forEach((el) => translateTextNodes(el));\n\n const current = translationsRef.current;\n const prev = prevTranslationsRef.current || {};\n const currentKeys = Object.keys(current);\n const prevKeys = Object.keys(prev);\n\n const added = currentKeys.filter((k) => !prevKeys.includes(k));\n const removed = prevKeys.filter((k) => !currentKeys.includes(k));\n const changed = currentKeys\n .filter((k) => prevKeys.includes(k) && prev[k] !== current[k])\n .map((k) => ({ key: k, old: prev[k], new: current[k] }));\n\n onKeysChange?.({ added, removed, changed });\n prevTranslationsRef.current = { ...current };\n\n isTranslatingRef.current = false;\n });\n }, [extraTags, translateTextNodes, onKeysChange]);\n\n useEffect(() => {\n let frameId;\n let timeoutId;\n frameId = requestAnimationFrame(() => {\n timeoutId = setTimeout(() => {\n initialScan();\n }, 0);\n });\n return () => {\n cancelAnimationFrame(frameId);\n clearTimeout(timeoutId);\n };\n }, [language, JSONData, translations, initialScan]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const pending = new Set();\n let scheduled = false;\n\n const flush = () => {\n scheduled = false;\n const targets = compressElements(pending);\n pending.clear();\n\n raf(() => {\n isTranslatingRef.current = true;\n // ✅ reset for every flush, so updated text nodes get reprocessed\n processedThisTick.current = new WeakSet();\n targets.forEach((el) => translateTextNodes(el));\n isTranslatingRef.current = false;\n });\n };\n\n const queue = (el) => {\n if (!(el instanceof Element) || isTranslatingRef.current) return;\n pending.add(el);\n if (!scheduled) {\n scheduled = true;\n raf(flush);\n }\n };\n\n const observer = new MutationObserver((mutations) => {\n if (isTranslatingRef.current) return;\n\n for (const m of mutations) {\n // ⛔ skip our own injected translation wrappers\n if (\n m.target instanceof Element &&\n (m.target.hasAttribute(\"data-translation-wrapper\") ||\n m.target.hasAttribute(\"data-translation-new\"))\n ) {\n continue;\n }\n\n if (m.type === \"childList\") {\n m.addedNodes.forEach((n) => {\n if (n.nodeType === Node.ELEMENT_NODE) queue(n);\n });\n } else if (m.type === \"characterData\") {\n const el = m.target?.parentElement;\n if (el instanceof Element) {\n // ✅ ensure this element is reprocessed if text changes dynamically\n processedThisTick.current.delete(el);\n queue(el);\n }\n } else if (m.type === \"attributes\") {\n if (m.target instanceof Element) {\n queue(m.target);\n }\n }\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [...attributes, \"data-lang\"],\n });\n\n return () => observer.disconnect();\n }, [translateTextNodes, attributes, onMutation]);\n\n const value = useMemo(\n () => ({\n translate,\n language,\n setLanguage,\n reload: initialScan,\n keys: keySetRef.current,\n }),\n [translate, language, initialScan]\n );\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n );\n};\n\nexport const useTranslation = () => {\n const ctx = useContext(TranslationContext);\n if (!ctx)\n throw new Error(\"useTranslation must be used inside TranslationProvider\");\n return ctx;\n};\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\n\nconst SupportedLang = [\n { code: \"af\", label: \"Afrikaans\" },\n { code: \"sq\", label: \"Albanian\" },\n { code: \"am\", label: \"Amharic\" },\n { code: \"ar\", label: \"Arabic\" },\n { code: \"hy\", label: \"Armenian\" },\n { code: \"az\", label: \"Azerbaijani\" },\n { code: \"eu\", label: \"Basque\" },\n { code: \"be\", label: \"Belarusian\" },\n { code: \"bn\", label: \"Bengali\" },\n { code: \"bs\", label: \"Bosnian\" },\n { code: \"bg\", label: \"Bulgarian\" },\n { code: \"ca\", label: \"Catalan\" },\n { code: \"ceb\", label: \"Cebuano\" },\n { code: \"ny\", label: \"Chichewa\" },\n { code: \"zh-CN\", label: \"Chinese (Simplified)\" },\n { code: \"zh-TW\", label: \"Chinese (Traditional)\" },\n { code: \"co\", label: \"Corsican\" },\n { code: \"hr\", label: \"Croatian\" },\n { code: \"cs\", label: \"Czech\" },\n { code: \"da\", label: \"Danish\" },\n { code: \"nl\", label: \"Dutch\" },\n { code: \"en\", label: \"English\" },\n { code: \"eo\", label: \"Esperanto\" },\n { code: \"et\", label: \"Estonian\" },\n { code: \"tl\", label: \"Filipino\" },\n { code: \"fi\", label: \"Finnish\" },\n { code: \"fr\", label: \"French\" },\n { code: \"fy\", label: \"Frisian\" },\n { code: \"gl\", label: \"Galician\" },\n { code: \"ka\", label: \"Georgian\" },\n { code: \"de\", label: \"German\" },\n { code: \"el\", label: \"Greek\" },\n { code: \"gu\", label: \"Gujarati\" },\n { code: \"ht\", label: \"Haitian Creole\" },\n { code: \"ha\", label: \"Hausa\" },\n { code: \"haw\", label: \"Hawaiian\" },\n { code: \"he\", label: \"Hebrew\" },\n { code: \"hi\", label: \"Hindi\" },\n { code: \"hmn\", label: \"Hmong\" },\n { code: \"hu\", label: \"Hungarian\" },\n { code: \"is\", label: \"Icelandic\" },\n { code: \"ig\", label: \"Igbo\" },\n { code: \"id\", label: \"Indonesian\" },\n { code: \"ga\", label: \"Irish\" },\n { code: \"it\", label: \"Italian\" },\n { code: \"ja\", label: \"Japanese\" },\n { code: \"jw\", label: \"Javanese\" },\n { code: \"kn\", label: \"Kannada\" },\n { code: \"kk\", label: \"Kazakh\" },\n { code: \"km\", label: \"Khmer\" },\n { code: \"ko\", label: \"Korean\" },\n { code: \"ku\", label: \"Kurdish (Kurmanji)\" },\n { code: \"ky\", label: \"Kyrgyz\" },\n { code: \"lo\", label: \"Lao\" },\n { code: \"la\", label: \"Latin\" },\n { code: \"lv\", label: \"Latvian\" },\n { code: \"lt\", label: \"Lithuanian\" },\n { code: \"lb\", label: \"Luxembourgish\" },\n { code: \"mk\", label: \"Macedonian\" },\n { code: \"mg\", label: \"Malagasy\" },\n { code: \"ms\", label: \"Malay\" },\n { code: \"ml\", label: \"Malayalam\" },\n { code: \"mt\", label: \"Maltese\" },\n { code: \"mi\", label: \"Maori\" },\n { code: \"mr\", label: \"Marathi\" },\n { code: \"mn\", label: \"Mongolian\" },\n { code: \"my\", label: \"Myanmar (Burmese)\" },\n { code: \"ne\", label: \"Nepali\" },\n { code: \"no\", label: \"Norwegian\" },\n { code: \"ps\", label: \"Pashto\" },\n { code: \"fa\", label: \"Persian\" },\n { code: \"pl\", label: \"Polish\" },\n { code: \"pt\", label: \"Portuguese\" },\n { code: \"pa\", label: \"Punjabi\" },\n { code: \"ro\", label: \"Romanian\" },\n { code: \"ru\", label: \"Russian\" },\n { code: \"sm\", label: \"Samoan\" },\n { code: \"gd\", label: \"Scots Gaelic\" },\n { code: \"sr\", label: \"Serbian\" },\n { code: \"st\", label: \"Sesotho\" },\n { code: \"sn\", label: \"Shona\" },\n { code: \"sd\", label: \"Sindhi\" },\n { code: \"si\", label: \"Sinhala\" },\n { code: \"sk\", label: \"Slovak\" },\n { code: \"sl\", label: \"Slovenian\" },\n { code: \"so\", label: \"Somali\" },\n { code: \"es\", label: \"Spanish\" },\n { code: \"su\", label: \"Sundanese\" },\n { code: \"sw\", label: \"Swahili\" },\n { code: \"sv\", label: \"Swedish\" },\n { code: \"tg\", label: \"Tajik\" },\n { code: \"ta\", label: \"Tamil\" },\n { code: \"te\", label: \"Telugu\" },\n { code: \"th\", label: \"Thai\" },\n { code: \"tr\", label: \"Turkish\" },\n { code: \"uk\", label: \"Ukrainian\" },\n { code: \"ur\", label: \"Urdu\" },\n { code: \"uz\", label: \"Uzbek\" },\n { code: \"vi\", label: \"Vietnamese\" },\n { code: \"cy\", label: \"Welsh\" },\n { code: \"xh\", label: \"Xhosa\" },\n { code: \"yi\", label: \"Yiddish\" },\n { code: \"yo\", label: \"Yoruba\" },\n { code: \"zu\", label: \"Zulu\" },\n];\n\nexport const GoogleTranslate = ({\n children,\n defaultLang = \"en\",\n getSupportedLangs = undefined,\n className = \"\",\n SkipTranslationTags = [\n \"button\",\n \"select\",\n \"input\",\n \"textarea\",\n \"script\",\n \"style\",\n \"code\",\n \"pre\",\n \"noscript\",\n \"iframe\",\n \"object\",\n ],\n SkipTranslationClassName = [],\n SkipTranslationAttributes = [\n \"title\",\n \"placeholder\",\n \"aria-label\",\n \"value\",\n \"data-*\",\n ],\n SkipTranslationIds = [],\n}) => {\n const [GoogleSelect, setGoogleSelect] = useState(null);\n const containerRef = useRef(\n document.getElementById(\"google_translate_element\")\n );\n const childrenRef = useRef(null);\n useLayoutEffect(() => {\n initGoogleTranslate().then((googleSelect) => {\n getSupportedLangs?.(googleSelect);\n });\n if (!document.getElementById(\"google-translate-script\")) {\n const StyelTranslate = `\n .skiptranslate iframe { display: none !important; }\n #goog-gt-tt { display: none !important; }\n .goog-te-gadget-simple {\n background-color: #FFF;\n border: 1px solid #D5D5D5;\n font-size: 10pt;\n display: inline-block;\n padding: 10px;\n border-radius: 10px;\n cursor: pointer;\n }\n .goog-te-combo {\n appearance: none !important;\n font-family: Roboto, Arial, sans-serif !important;\n font-size: 14px !important;\n font-weight: 500 !important;\n border: 1px solid #c4c4c4 !important;\n border-radius: 8px !important;\n padding: 10px 12px !important;\n background-color: #fff !important;\n color: #333 !important;\n transition: border-color 0.2s ease, box-shadow 0.2s ease !important;\n cursor: pointer !important;\n }\n .goog-te-combo:focus {\n border-color: #1976d2 !important;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.25) !important;\n outline: none !important;\n }\n .goog-te-combo:hover {\n border-color: #1976d2 !important;\n }\n .VIpgJd-ZVi9od-aZ2wEe-wOHMyf{\n display: none !important;\n }\n #google_translate_element {\n display: none !important;\n }\n `;\n const script = document.createElement(\"script\");\n script.id = \"google-translate-script\";\n script.src =\n \"//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit\";\n script.type = \"text/javascript\";\n document.head.appendChild(script);\n\n const StyelTranslateStyle = document.createElement(\"style\");\n StyelTranslateStyle.innerHTML = StyelTranslate;\n document.head.appendChild(StyelTranslateStyle);\n }\n }, [containerRef]);\n\n useEffect(() => {\n EveryCheck();\n }, [defaultLang]);\n\n const EveryCheck = useCallback(() => {\n if (GoogleSelect && GoogleSelect?.options?.length > 0) {\n document.documentElement.setAttribute(\"lang\", defaultLang);\n Array.from(GoogleSelect.options).forEach((item, index) => {\n if (item?.value?.toString() === defaultLang?.toString()) {\n GoogleSelect.value = defaultLang;\n GoogleSelect.selectedIndex = index;\n GoogleSelect.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n });\n }\n }, [GoogleSelect, defaultLang]);\n\n const initGoogleTranslate = () => {\n return new Promise((reslove, reject) => {\n window.googleTranslateElementInit = () => {\n const google_translate_element = document.createElement(\"div\");\n google_translate_element.id = \"google_translate_element\";\n google_translate_element.setAttribute(\n \"suppressHydrationWarning\",\n \"true\"\n );\n document.body.appendChild(google_translate_element);\n new window.google.translate.TranslateElement(\n {\n pageLanguage: defaultLang,\n includedLanguages: SupportedLang.map((item) => item.code).join(\",\"),\n layout:\n window.google.translate.TranslateElement.InlineLayout.HORIZONTAL,\n },\n \"google_translate_element\"\n );\n // ✅ Poll until .goog-te-combo exists\n const checkCombo = () => {\n const select = document.querySelector(\".goog-te-combo\");\n if (!select) {\n const CreateSelect = document.createElement(\"select\");\n CreateSelect.className = \".goog-te-combo\";\n containerRef.current.appendChild(CreateSelect);\n setGoogleSelect(document.querySelector(\".goog-te-combo\"));\n }\n if (select.childNodes.length === 0) {\n InsertOption(select);\n const getOptions = Array.from(\n document.querySelector(\".goog-te-combo\")?.options\n );\n reslove(\n getOptions.map((items) => {\n return { code: items.value, label: items.innerHTML };\n })\n );\n setGoogleSelect(document.querySelector(\".goog-te-combo\"));\n } else {\n const getOptions = Array.from(\n document.querySelector(\".goog-te-combo\")?.options\n );\n reslove(\n getOptions.map((items) => {\n return { code: items.value, label: items.innerHTML };\n })\n );\n setGoogleSelect(document.querySelector(\".goog-te-combo\"));\n }\n };\n checkCombo();\n };\n });\n };\n\n const InsertOption = useCallback((select) => {\n const existing = new Set(Array.from(select?.options).map((o) => o?.value));\n SupportedLang.forEach((element) => {\n if (!existing.has(element.code)) {\n const option = document.createElement(\"option\");\n option.value = element.code;\n option.textContent = element.label;\n select.append(option); // safer than appendChild\n }\n });\n }, []);\n\n // ✅ Protect interactive + user-defined skip elements\n // 🔹 Protect elements\n useEffect(() => {\n const protectInteractiveElements = () => {\n // Select only \"real app nodes\", ignore Google's injected stuff\n const safeNodes = document.querySelectorAll(\n \"body *:not(.goog-te-menu-value):not(.goog-te-combo):not(.goog-te-banner-frame):not(.goog-te-balloon-frame):not(.VIpgJd-ZVi9od-ORHb-OEVmcd)\"\n );\n\n safeNodes.forEach((el) => {\n // 1. Skip whole tags\n SkipTranslationTags.forEach((tag) => {\n if (el.matches(tag)) {\n markAsNoTranslate(el, true);\n }\n });\n\n // 2. Skip by class\n SkipTranslationClassName.forEach((cls) => {\n if (el.classList.contains(cls)) {\n markAsNoTranslate(el, true);\n }\n });\n\n // 3. Skip by ID\n SkipTranslationIds.forEach((id) => {\n if (el.id === id) {\n markAsNoTranslate(el, true);\n }\n });\n\n // 4. Skip by attribute\n SkipTranslationAttributes.forEach((attr) => {\n if (attr === \"data-*\") {\n // special handling for data-* attributes\n for (const at of el.attributes) {\n if (at.name.startsWith(\"data-\")) {\n markAsNoTranslate(el, false); // skip metadata only\n }\n }\n } else if (el.hasAttribute(attr)) {\n markAsNoTranslate(el, false);\n }\n });\n\n // 5. Skip JSON/code/hash-like text\n if (\n el.childNodes.length === 1 &&\n el.childNodes[0].nodeType === 3 // text node\n ) {\n const text = el.textContent.trim();\n if (isNonTranslatableText(text)) {\n markAsNoTranslate(el, true);\n }\n }\n });\n };\n\n protectInteractiveElements();\n\n // Re-run when Google mutates DOM\n const observer = new MutationObserver(protectInteractiveElements);\n observer.observe(document.body, { childList: true, subtree: true });\n\n return () => observer.disconnect();\n }, [\n SkipTranslationTags,\n SkipTranslationClassName,\n SkipTranslationIds,\n SkipTranslationAttributes,\n ]);\n\n // 🔹 Utility: mark element as skipped\n const markAsNoTranslate = (el, fullSkip = true) => {\n if (fullSkip) {\n if (!el.hasAttribute(\"translate\")) el.setAttribute(\"translate\", \"no\");\n el.classList.add(\"notranslate\");\n el.setAttribute(\"data-lang\", \"notranslate\");\n } else {\n // Only skip metadata, not visible inner text\n el.setAttribute(\"translate\", \"no-attr\");\n el.classList.add(\"notranslate-attr\");\n }\n // 🔹 Remove empty attributes\n for (const attr of Array.from(el.attributes)) {\n if (attr.value === \"\" || attr.value == null) {\n el.removeAttribute(attr.name);\n }\n }\n };\n\n // 🔹 Detect non-translatable text (JSON/code/hash)\n const isNonTranslatableText = (text) => {\n return (\n /^\\s*[{[].*[}\\]]\\s*$/.test(text) || // JSON-like\n /^[A-Za-z0-9+/=]{20,}$/.test(text) || // base64/hash\n /function\\s*\\(|=>/.test(text) // code-like\n );\n };\n\n useEffect(() => {\n const removeBodyStyle = () => {\n document.body.removeAttribute(\"style\");\n };\n removeBodyStyle();\n const observer = new MutationObserver(() => {\n removeBodyStyle();\n if (document.documentElement.getAttribute(\"lang\") === \"auto\") {\n document.documentElement.setAttribute(\"lang\", defaultLang);\n }\n });\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"style\", \"lang\"],\n });\n return () => observer.disconnect();\n }, []);\n\n return (\n <>\n <div>\n <div ref={childrenRef}>{children}</div>\n </div>\n </>\n );\n};\n"],"mappings":"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","names":["node","import_react","import_jsx_runtime","_a"]}