Linux sh52.ich-4.com 5.14.0-611.26.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jan 29 05:24:47 EST 2026 x86_64
LiteSpeed
Server IP : 198.143.147.58 & Your IP : 216.73.217.21
Domains :
Cant Read [ /etc/named.conf ]
User : actualbuzz
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
opt /
cpguard /
app /
api /
public /
captcha /
Delete
Unzip
Name
Size
Permission
Date
Action
vendor
[ DIR ]
drwxr-xr-x
2025-12-12 04:41
altcha.php
17.93
KB
-rw-r--r--
2025-12-23 13:11
captcha.php
26.03
KB
-rw-r--r--
2025-12-23 13:11
composer.json
392
B
-rw-r--r--
2025-12-23 13:11
http.html
34.26
KB
-rw-r--r--
2025-12-23 13:11
https.html
32.55
KB
-rw-r--r--
2025-12-23 13:11
unblock.php
3.18
KB
-rw-r--r--
2025-12-23 13:11
Save
Rename
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <title data-i18n="page_title">Security Check Required</title> <meta name="description" content="Security verification required to continue." /> <style> :root { /* LIGHT MODE (Default) */ --bg0: #eef2f7; --bg1: #f7f9fc; --glass: rgba(255, 255, 255, .58); --glass-2: rgba(255, 255, 255, .42); --glass-solid: rgba(255, 255, 255, .70); --line: rgba(15, 23, 42, .12); --line-2: rgba(15, 23, 42, .08); --text: #0f172a; --muted: #5b667a; --accent: #dc2626; --card-bg: white; --card-side-bg: rgba(255, 255, 255, .38); --radius: 10px; --radius-sm: 10px; --shadow: 0 10px 30px rgba(15, 23, 42, .08); --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"; } /* DARK MODE SUPPORT */ @media (prefers-color-scheme: dark) { :root { --bg0: #020617; --bg1: #0f172a; --glass: rgba(15, 23, 42, .60); --glass-2: rgba(15, 23, 42, .42); --glass-solid: rgba(30, 41, 59, .70); --line: rgba(255, 255, 255, .15); --line-2: rgba(255, 255, 255, .10); --text: #f1f5f9; --muted: #94a3b8; --accent: #ef4444; --card-bg: #1e293b; --card-side-bg: rgba(30, 41, 59, .50); --shadow: 0 10px 30px rgba(0, 0, 0, .5); } body:before { opacity: .08; /* Reduce noise opacity in dark mode */ } .mark { background: radial-gradient(90px 60px at 30% 20%, rgba(255, 255, 255, .10), transparent 60%), linear-gradient(180deg, rgba(220, 38, 38, .2), rgba(255, 255, 255, .05)) !important; } .side h2, .side h3, .item strong { color: #e2e8f0 !important; } /* Checkbox/Input adjustments for dark mode */ } * { box-sizing: border-box; } html, body { height: 100%; } body { margin: 0; font-family: var(--sans); color: var(--text); background: radial-gradient(900px 500px at 18% 10%, rgba(99, 102, 241, .10), transparent 60%), radial-gradient(900px 500px at 80% 0%, rgba(16, 185, 129, .08), transparent 55%), radial-gradient(900px 500px at 72% 92%, rgba(220, 38, 38, .06), transparent 60%), linear-gradient(180deg, var(--bg1), var(--bg0)); line-height: 1.35; -webkit-font-smoothing: antialiased; overflow-x: hidden; } body:before { content: ""; position: fixed; inset: 0; pointer-events: none; background: repeating-linear-gradient(0deg, rgba(255, 255, 255, .035) 0 1px, transparent 1px 2px); opacity: .18; mix-blend-mode: overlay; } .page { min-height: 100%; display: flex; flex-direction: column; } .topbar { position: sticky; top: 0; z-index: 10; background: var(--glass); backdrop-filter: blur(14px) saturate(140%); -webkit-backdrop-filter: blur(14px) saturate(140%); border-bottom: 1px solid var(--line-2); } .topbar-inner { max-width: 1040px; margin: 0 auto; padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 16px; } .brand { display: flex; align-items: baseline; gap: 10px; min-width: 0; } .domain { font-weight: 650; letter-spacing: -.02em; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text); } .status { font-size: 12px; color: var(--muted); font-family: var(--mono); border: 1px solid var(--line-2); padding: 6px 10px; border-radius: var(--radius-sm); background: rgba(255, 255, 255, .55); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); white-space: nowrap; display: none; } .status-top { font-size: 12px; color: var(--muted); font-family: var(--mono); border: 1px solid var(--line-2); padding: 6px 10px; border-radius: var(--radius-sm); background: rgba(255, 255, 255, .55); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); white-space: nowrap; } .main { flex: 1; display: flex; align-items: center; justify-content: center; padding: 28px 20px 18px; } .wrap { width: 100%; max-width: 1040px; display: grid; grid-template-columns: 1.1fr .9fr; gap: 18px; align-items: start; } .card-main { border-radius: var(--radius); background-color: var(--card-bg); overflow: hidden; } .side { outline-offset: -1px; padding: 20px 18px; } .hero { padding: 22px 22px 18px; display: grid; grid-template-columns: 56px 1fr; gap: 16px; align-items: start; } .mark { width: 56px; height: 56px; border-radius: 14px; background: radial-gradient(90px 60px at 30% 20%, rgba(255, 255, 255, .70), transparent 60%), linear-gradient(180deg, rgba(220, 38, 38, .14), rgba(255, 255, 255, .02)); border: 1px solid rgba(220, 38, 38, .18); box-shadow: 0 8px 18px rgba(15, 23, 42, .06); display: grid; place-items: center; } .mark svg { width: 28px; height: 28px; color: var(--accent); } h1 { margin: 0 0 6px 0; font-size: 22px; letter-spacing: -.03em; font-weight: 720; color: var(--text); } .lead { margin: 0; color: var(--muted); font-size: 13px; max-width: 64ch; } .captcha { border-top: 1px solid var(--line-2); padding: 16px 22px 20px; display: grid; gap: 12px; } .captcha-title h2 { margin: 0; font-size: 13px; font-weight: 700; letter-spacing: -.01em; color: var(--text); } .captcha-box { background: radial-gradient(230px 140px at 22% 37%, rgba(255, 255, 255, 0.12), transparent 51%), linear-gradient(180deg, rgba(255, 255, 255, .14), rgba(255, 255, 255, .08)); border: 1px solid var(--line-2); border-radius: var(--radius-sm); padding: 15px; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); box-shadow: 0 10px 22px rgba(15, 23, 42, .05); } .captcha-left { display: flex; align-items: center; gap: 8px; position: relative; float: left } .side h2 { margin: 0 0 10px 0; font-size: 18px; font-weight: 760; letter-spacing: -.01em; color: #4e5d7c; } .side h3 { margin: 0 0 10px 0; font-size: 14px; font-weight: 760; letter-spacing: -.01em; color: #4e5d7c; } .side p { margin: 0 0 12px 0; color: var(--muted); font-size: 13px; } .list { margin: 0; padding: 0; list-style: none; display: grid; gap: 10px; } .item { margin-left: -10px; border-radius: var(--radius-sm); padding: 12px; background: var(--card-side-bg); backdrop-filter: blur(12px); } .item strong { display: block; font-size: 13px; letter-spacing: -.01em; margin-bottom: 2px; font-weight: 720; color: #4e5d7c; } .item span { font-size: 12px; color: var(--muted); } .actions { margin-top: 12px; display: flex; gap: 10px; flex-wrap: wrap; } .btn { appearance: none; border: 1px solid var(--line); background: var(--glass-solid); color: var(--text); padding: 10px 12px; border-radius: var(--radius-sm); font-size: 13px; font-weight: 700; letter-spacing: -.01em; cursor: pointer; backdrop-filter: blur(12px); transition: all .18s ease; } .btn:hover { border-color: rgba(15, 23, 42, .22); box-shadow: 0 10px 22px rgba(15, 23, 42, .06); background: var(--bg0); } @media (prefers-color-scheme: dark) { .btn:hover { border-color: #fff; } } .btn-primary { border-color: rgba(220, 38, 38, .24); background: linear-gradient(180deg, rgba(220, 38, 38, .12), rgba(255, 255, 255, .05)); } footer { padding: 0 0 14px; } .footer-inner { max-width: 1040px; margin: 0 auto; padding: 14px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--muted); font-size: 12px; } .footer-left { display: flex; align-items: center; gap: 10px; min-width: 0; } .footer-logo { height: 32px; width: auto; display: block; opacity: .95; } @media (max-width: 900px) { .wrap { grid-template-columns: 1fr; } .hero { grid-template-columns: 52px 1fr; padding: 20px 18px 16px; } .captcha { padding: 14px 18px 18px; } .side { padding: 18px; } h1 { font-size: 20px; } } </style> </head> <body> <div class="page"> <header class="topbar"> <div class="topbar-inner"> <div class="brand" title="Requested host"> <div id="hostname" data-i18n="">Firewall Block</div> </div> <div class="status-top" data-i18n="status_badge">SECURITY CHECK</div> </div> </header> <main class="main"> <div class="wrap"> <section class="card card-main" aria-labelledby="title"> <div class="hero"> <div class="mark" aria-hidden="true"> <svg fill="currentColor" width="32px" height="32px" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"> <path d="M79.2,211.44h0c15.52-8.82,34.91-2.28,43.31,13.68l41.38,84.41a7,7,0,0,0,8.93,3.43h0a7,7,0,0,0,4.41-6.52V72c0-13.91,12.85-24,26.77-24s26,10.09,26,24V228.64A11.24,11.24,0,0,0,240.79,240,11,11,0,0,0,252,229V24c0-13.91,10.94-24,24.86-24S302,10.09,302,24V228.64A11.24,11.24,0,0,0,312.79,240,11,11,0,0,0,324,229V56c0-13.91,12.08-24,26-24s26,11.09,26,25V244.64A11.24,11.24,0,0,0,386.79,256,11,11,0,0,0,398,245V120c0-13.91,11.08-24,25-24s25.12,10.22,25,24V336c0,117.41-72,176-160,176H272c-88,0-115.71-39.6-136-88L67.33,255C60.67,237,63.69,220.25,79.2,211.44Z" /> </svg> </div> <div> <h1 id="title" data-i18n="main_title">Verify you are human</h1> <p class="lead" data-i18n="main_lead"> We detected unusual traffic patterns from your network. Please complete the verification to continue. </p> </div> </div> <div class="captcha"> <div class="captcha-title"> <h2 data-i18n="captcha_title">Human verification</h2> </div> <div class="captcha-box"> <style> altcha-widget { width: 100%; } .altcha-error { display: none !important; } .altcha { border: none !important; max-width: 100% !important; } .badge { flex: 0 0 auto; font-size: 12px; color: var(--text); background: rgba(255, 255, 255, .45); border: 1px solid var(--line); padding: 6px 10px; border-radius: 999px; font-family: var(--mono); backdrop-filter: blur(10px); } .check { width: 18px; height: 18px; border-radius: 6px; border: 1px solid var(--line); background: rgba(255, 255, 255, .70); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .55); flex: 0 0 auto; } @media (prefers-color-scheme: dark) { .check, .altcha-checkbox input { background: rgba(30, 41, 59, .8) !important; border-color: var(--line) !important; } .status, .status-top { background: rgb(0 0 0 / 0%) !important; } } </style> <script async defer src="https://cdn.jsdelivr.net/npm/altcha/dist/altcha.min.js" type="module"></script> <altcha-widget id="altchaBox" challengeurl="/altcha.php" verifyurl="/altcha.php" success-text="✅ Verified. Redirecting..." error-text="❌ Verification failed. Reloading…"> </altcha-widget> <script> let t; let captchaHandled = false; if (t === undefined) t = {}; (function () { const isPassed = window.name === "captcha_passed" || window.location.hash === "#verified"; // redirect if already verified if (isPassed) { document.body.style.display = 'none'; window.name = ""; window.location.replace(window.location.pathname + window.location.search); return; } const isHTTPS = location.protocol === 'https:'; if (!isHTTPS) { console.warn('This page should be served over HTTPS. Altcha widget requires secure context for production.'); } // keeping the referer url for redirect after captcha if (!window.name || !window.name.startsWith("redirect:")) { const u = document.referrer || window.location.href; if (u && u.startsWith(location.origin)) { window.name = "redirect:" + new URL(u).pathname + new URL(u).search; } } const widgetEl = document.getElementById('altchaBox'); const VERIFY_ENDPOINT = 'altcha.php'; // success handling and redirection async function handleSuccess() { if (captchaHandled) return; captchaHandled = true; const redirectUrl = window.name.startsWith("redirect:") ? window.name.slice(9) : '/'; fetch(redirectUrl, { method: 'HEAD', mode: 'same-origin', cache: 'no-store', keepalive: true }); window.location.replace(redirectUrl); } // failure handling function handleFailure() { document.getElementsByClassName('altcha-label')[0].textContent = t.widget_error || "Verification failed. Reloading…"; if (captchaHandled) return; captchaHandled = false; setTimeout(() => { location.reload(); }, 1500); } if (!window._altchaVerifyPatched) { // custom altcha translations const altchaContainer = document.querySelector('#altchaBox'); // your widget container if (altchaContainer) { const observer = new MutationObserver((mutations) => { mutations.forEach(() => { translateAltcha(); }); }); observer.observe(altchaContainer, { childList: true, subtree: true }); } function translateAltcha() { const mapping = { 'Protected by': t.protected_by || 'Protected by', "I'm not a robot": t.captcha_label || "I'm not a robot", 'Verifying...': t.captcha_verifying || 'Verifying', 'Verified': t.widget_success || 'Verified. Redirecting...', 'Failed': t.widget_error || 'Verification failed. Reloading…' }; const altchaContainer = document.querySelector('#altchaBox'); if (!altchaContainer) return; const walker = document.createTreeWalker( altchaContainer, NodeFilter.SHOW_TEXT, null, false ); let node; while ((node = walker.nextNode())) { Object.keys(mapping).forEach(key => { if (node.nodeValue.includes(key)) { if (node.nodeValue === key) { node.nodeValue = mapping[key]; } } }); } } // altcha ajax call handling and redirection window._altchaVerifyPatched = true; const realFetch = window.fetch.bind(window); window.fetch = async function (...args) { // defaultMessage(); if (typeof args[1] === 'undefined') args[1] = {}; if (!args[1].headers) args[1].headers = {}; args[1].headers['X-Captcha-Request'] = 'widget'; const resp = await realFetch(...args); try { const url = typeof args[0] === 'string' ? args[0] : (args[0] && args[0].url) || ''; const method = (args[1] && args[1].method) ? String(args[1].method).toUpperCase() : 'GET'; if (method === 'POST' && url.includes(VERIFY_ENDPOINT)) { resp.clone().json().then(data => { if (!data) return; if (data.status === 'ok' || data.status === 'success' || data.success === true) { handleSuccess(); } else { handleFailure(); } }).catch(() => { handleFailure(); }); } } catch (e) { handleFailure(); } return resp; }; } if (widgetEl) widgetEl.style.display = 'block'; })(); </script> </div> <div class="actions"> <button class="btn btn-primary" type="button" onclick="location.reload()" data-i18n="btn_retry">Try again</button> </div> </div> </section> <aside class="card side" aria-label="Information"> <h2 data-i18n="aside_title">What happened?</h2> <p data-i18n="aside_text"> We use automated security to prevent abusive traffic. Your IP is currently blocked or has been flagged for unusual activity. </p> <h3 data-i18n="aside_subtitle">What can I do?</h3> <ul class="list"> <li class="item"> <strong data-i18n="item_visitor_title">If you are a visitor</strong> <span data-i18n="item_visitor_text">Complete the verification above, then retry. If it persists, wait for some time and try again.</span> </li> <li class="item"> <strong data-i18n="item_owner_title">If you are the site owner</strong> <span data-i18n="item_owner_text">Review cPGuard firewall/WAF/Fail2Ban activity to identify the trigger. If appropriate, whitelist or remove the IP from temporary blocklist.</span> </li> </ul> </aside> </div> </main> <footer> <div class="footer-inner"> <div class="footer-left"> <img class="footer-logo" src="https://opsshield.com/images/cpguard-logo.svg" alt="cPGuard" /> <div class="footer-text">© <span id="y"></span> cPGuard. <span data-i18n="rights">All rights reserved.</span></div> </div> <div><span data-i18n="protected_by">Protected by</span> <strong>cPGuard Firewall</strong></div> </div> </footer> </div> </body> <script> // set dynamic host and year values document.getElementById("hostname").textContent = window.location.hostname; document.getElementById("y").textContent = new Date().getFullYear(); // --- LANGUAGE CONFIGURATION --- const translations = { "en": { page_title: "Security Check Required", brand: "Firewall Block", status_badge: "SECURITY CHECK", main_title: "Verify you are human", main_lead: "We detected unusual traffic patterns from your network. Please complete the verification to continue.", captcha_title: "Human verification", msg_verified: "✅ Verified — redirecting…", msg_failed: "❌ Verification failed. Please try again.", btn_retry: "Try again", aside_title: "What happened?", aside_text: "We use automated security systems to prevent abusive traffic. Your IP address has been temporarily blocked or flagged for unusual activity.", aside_subtitle: "What can I do?", item_visitor_title: "If you are a visitor", item_visitor_text: "Complete the verification above and try again. If the issue persists, please wait a while and retry.", item_owner_title: "If you are the site owner", item_owner_text: "Review cPGuard firewall/WAF/Fail2Ban activity logs to identify the trigger. If appropriate, whitelist the IP address.", rights: "All rights reserved.", protected_by: "Protected by", widget_success: "Verified. Redirecting…", widget_error: "Verification failed. Reloading…", captcha_verifying: "Verifying…", captcha_label: "I’m not a robot", captcha_badge: "VERIFY" }, "pt-BR": { page_title: "Verificação de Segurança Necessária", brand: "Bloqueio de Firewall", status_badge: "VERIFICAÇÃO DE SEGURANÇA", main_title: "Confirme que você é humano", main_lead: "Detectamos padrões de tráfego incomuns na sua rede. Conclua a verificação para continuar.", captcha_title: "Verificação humana", msg_verified: "✅ Verificado — redirecionando…", msg_failed: "❌ Falha na verificação. Tente novamente.", btn_retry: "Tentar novamente", aside_title: "O que aconteceu?", aside_text: "Utilizamos sistemas de segurança automatizados para prevenir tráfego abusivo. Seu endereço IP foi temporariamente bloqueado ou sinalizado.", aside_subtitle: "O que posso fazer?", item_visitor_title: "Se você for um visitante", item_visitor_text: "Conclua a verificação acima e tente novamente. Se o problema persistir, aguarde alguns instantes e tente de novo.", item_owner_title: "Se você for o proprietário do site", item_owner_text: "Verifique os logs do firewall/WAF/Fail2Ban do cPGuard para identificar o motivo. Se necessário, adicione o IP à lista de permissões.", rights: "Todos os direitos reservados.", protected_by: "Protegido por", widget_success: "Verificado. Redirecionando…", widget_error: "Falha na verificação. Recarregando…", captcha_verifying: "Verificando…", captcha_label: "Não sou um robô", captcha_badge: "VERIFICAR" }, "es": { page_title: "Verificación de Seguridad Requerida", brand: "Bloqueo del Firewall", status_badge: "CONTROL DE SEGURIDAD", main_title: "Verifique que es humano", main_lead: "Hemos detectado tráfico inusual desde su red. Por favor, complete la verificación para continuar.", captcha_title: "Verificación humana", msg_verified: "✅ Verificado — redirigiendo…", msg_failed: "❌ La verificación falló. Inténtelo de nuevo.", btn_retry: "Intentar de nuevo", aside_title: "¿Qué ocurrió?", aside_text: "Utilizamos sistemas de seguridad automatizados para prevenir tráfico abusivo. Su dirección IP ha sido bloqueada temporalmente o marcada por actividad inusual.", aside_subtitle: "¿Qué puedo hacer?", item_visitor_title: "Si es un visitante", item_visitor_text: "Complete la verificación anterior y vuelva a intentarlo. Si el problema persiste, espere un momento e inténtelo de nuevo.", item_owner_title: "Si es el propietario del sitio", item_owner_text: "Revise los registros del firewall/WAF/Fail2Ban de cPGuard para identificar la causa. Si corresponde, agregue el IP a la lista blanca.", rights: "Todos los derechos reservados.", protected_by: "Protegido por", widget_success: "Verificado. Redirigiendo…", widget_error: "Falló la verificación. Recargando…", captcha_verifying: "Verificando…", captcha_label: "No soy un robot", captcha_badge: "VERIFICAR" }, "ru": { page_title: "Требуется проверка безопасности", brand: "Блокировка брандмауэра", status_badge: "ПРОВЕРКА БЕЗОПАСНОСТИ", main_title: "Подтвердите, что вы человек", main_lead: "Мы обнаружили необычный трафик из вашей сети. Пожалуйста, пройдите проверку, чтобы продолжить.", captcha_title: "Проверка человека", msg_verified: "✅ Проверено — перенаправление…", msg_failed: "❌ Проверка не удалась. Попробуйте снова.", btn_retry: "Попробовать снова", aside_title: "Что произошло?", aside_text: "Мы используем автоматические системы защиты для предотвращения вредоносного трафика. Ваш IP-адрес был временно заблокирован или отмечен как подозрительный.", aside_subtitle: "Что можно сделать?", item_visitor_title: "Если вы посетитель", item_visitor_text: "Пройдите проверку выше и повторите попытку. Если проблема сохраняется, подождите некоторое время и попробуйте снова.", item_owner_title: "Если вы владелец сайта", item_owner_text: "Проверьте журналы firewall/WAF/Fail2Ban в cPGuard, чтобы определить причину. При необходимости добавьте IP в белый список.", rights: "Все права защищены.", protected_by: "Защищено", widget_success: "Проверка пройдена. Перенаправление…", widget_error: "Ошибка проверки. Перезагрузка…", captcha_verifying: "Проверка…", captcha_label: "Я не робот", captcha_badge: "ПРОВЕРИТЬ" }, "ko": { page_title: "보안 확인이 필요합니다", brand: "방화벽 차단", status_badge: "보안 검사", main_title: "사람인지 확인해 주세요", main_lead: "귀하의 네트워크에서 비정상적인 트래픽이 감지되었습니다. 계속하려면 확인을 완료해 주세요.", captcha_title: "사람 확인", msg_verified: "✅ 확인됨 — 이동 중…", msg_failed: "❌ 확인에 실패했습니다. 다시 시도해 주세요.", btn_retry: "다시 시도", aside_title: "무슨 일이 발생했나요?", aside_text: "비정상적인 트래픽을 방지하기 위해 자동 보안 시스템을 사용하고 있습니다. 귀하의 IP 주소가 일시적으로 차단되었거나 의심스러운 활동으로 표시되었습니다.", aside_subtitle: "어떻게 하면 되나요?", item_visitor_title: "방문자인 경우", item_visitor_text: "위의 확인을 완료한 후 다시 시도해 주세요. 문제가 계속되면 잠시 후 다시 시도하십시오.", item_owner_title: "사이트 소유자인 경우", item_owner_text: "cPGuard 방화벽/WAF/Fail2Ban 로그를 확인하여 원인을 파악하고, 필요 시 IP를 허용 목록에 추가하십시오.", rights: "모든 권리 보유.", protected_by: "보호 제공:", widget_success: "확인됨. 이동 중…", widget_error: "확인 실패. 다시 로드 중…", captcha_verifying: "확인 중…", captcha_label: "로봇이 아닙니다", captcha_badge: "확인" } }; function applyLanguage() { const browserLang = navigator.language || navigator.userLanguage; let langKey = 'en'; // Default if (translations[browserLang]) { langKey = browserLang; } else { const shortCode = browserLang.split('-')[0]; if (translations[shortCode]) { langKey = shortCode; } } t = translations[langKey]; document.querySelectorAll('[data-i18n]').forEach(el => { const key = el.getAttribute('data-i18n'); if (t[key]) { el.textContent = t[key]; } }); const widget = document.getElementById('altchaBox'); if (widget) { if (t.widget_success) widget.setAttribute('success-text', t.widget_success); if (t.widget_error) widget.setAttribute('error-text', t.widget_error); } document.documentElement.lang = langKey; } applyLanguage(); </script> </html>