feat: finish bilingual session auth learning lab

This commit is contained in:
Codex
2026-03-24 09:18:13 +08:00
parent 4cc4c26f2b
commit 5e318cb7f4
27 changed files with 1911 additions and 1079 deletions

92
web/assets/struts-lab.js Normal file
View File

@@ -0,0 +1,92 @@
(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
};
})();