(function () { const LANGUAGE_KEY = "struts_lab_language"; function getLanguage() { return localStorage.getItem(LANGUAGE_KEY) === "en" ? "en" : "zh"; } function setLanguage(language) { const resolved = language === "en" ? "en" : "zh"; localStorage.setItem(LANGUAGE_KEY, resolved); document.documentElement.lang = resolved === "zh" ? "zh-CN" : "en"; return resolved; } function applyText(values) { Object.entries(values || {}).forEach(([id, value]) => { const node = document.getElementById(id); if (node) { node.textContent = value; } }); } function applyHtml(values) { Object.entries(values || {}).forEach(([id, value]) => { const node = document.getElementById(id); if (node) { node.innerHTML = value; } }); } function applyPlaceholders(values) { Object.entries(values || {}).forEach(([id, value]) => { const node = document.getElementById(id); if (node) { node.setAttribute("placeholder", value); } }); } function mount(config) { const state = { language: setLanguage(getLanguage()) }; const button = document.getElementById(config.buttonId || "languageBtn"); function messages() { return config.messages[state.language] || config.messages.zh || {}; } function render() { const current = messages(); if (current.pageTitle) { document.title = current.pageTitle; } applyText(current.text); applyHtml(current.html); applyPlaceholders(current.placeholders); if (button) { button.textContent = state.language === "zh" ? "EN" : "中文"; } if (typeof config.render === "function") { config.render({ language: state.language, messages: current, setLanguage }); } } if (button) { button.addEventListener("click", function () { state.language = setLanguage(state.language === "zh" ? "en" : "zh"); render(); }); } render(); return { getLanguage: function () { return state.language; } }; } window.strutsLab = { mount: mount, getLanguage: getLanguage, setLanguage: setLanguage }; })();