<!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> |