var I18N_SHARED = { 'zh-CN': { pageTitleBase: 'Secrets', navMcp: 'MCP', navEntries: '条目', navAudit: '审计', signOut: '退出', mobileLabelTime: '时间', mobileLabelAction: '动作', mobileLabelTarget: '目标', mobileLabelDetail: '详情' }, 'zh-TW': { pageTitleBase: 'Secrets', navMcp: 'MCP', navEntries: '條目', navAudit: '審計', signOut: '登出', mobileLabelTime: '時間', mobileLabelAction: '動作', mobileLabelTarget: '目標', mobileLabelDetail: '詳情' }, en: { pageTitleBase: 'Secrets', navMcp: 'MCP', navEntries: 'Entries', navAudit: 'Audit', signOut: 'Sign out', mobileLabelTime: 'Time', mobileLabelAction: 'Action', mobileLabelTarget: 'Target', mobileLabelDetail: 'Detail' } }; var currentLang = localStorage.getItem('lang') || 'zh-CN'; var I18N_PAGE = {}; function t(key) { var dict = I18N_PAGE[currentLang] || I18N_PAGE['en'] || {}; var val = dict[key] || (I18N_SHARED[currentLang] && I18N_SHARED[currentLang][key]) || (I18N_SHARED.en && I18N_SHARED.en[key]) || key; return val; } function tf(key, vars) { var tpl = t(key); return Object.keys(vars || {}).reduce(function (acc, k) { return acc.replace(new RegExp('\\{' + k + '\\}', 'g'), String(vars[k])); }, tpl); } function applyLang() { document.documentElement.lang = currentLang; var title = t('pageTitle'); if (title) document.title = title; document.querySelectorAll('[data-i18n]').forEach(function (el) { var key = el.getAttribute('data-i18n'); el.textContent = t(key); }); document.querySelectorAll('[data-i18n-ph]').forEach(function (el) { var key = el.getAttribute('data-i18n-ph'); el.placeholder = t(key); }); document.querySelectorAll('.lang-btn').forEach(function (btn) { var map = { 'zh-CN': '简', 'zh-TW': '繁', en: 'EN' }; btn.classList.toggle('active', btn.textContent === map[currentLang]); }); if (typeof applyPageLang === 'function') applyPageLang(); } window.setLang = function (lang) { currentLang = lang; localStorage.setItem('lang', lang); applyLang(); };