code created by GPT-5.3-Codex
This commit is contained in:
98
static/js/simple_i18n.js
Normal file
98
static/js/simple_i18n.js
Normal file
@@ -0,0 +1,98 @@
|
||||
(function () {
|
||||
var supported = ["en", "it", "fr", "de", "es"];
|
||||
var fallback = "en";
|
||||
var aliases = {
|
||||
"en-us": "en",
|
||||
"de-ch": "de",
|
||||
"fr-ch": "fr"
|
||||
};
|
||||
|
||||
function normalizeLanguage(lang) {
|
||||
if (!lang) return fallback;
|
||||
var normalized = String(lang).toLowerCase().replace("_", "-");
|
||||
if (aliases[normalized]) return aliases[normalized];
|
||||
var base = normalized.split("-")[0];
|
||||
if (supported.indexOf(base) !== -1) return base;
|
||||
return fallback;
|
||||
}
|
||||
|
||||
function getInitialLanguage() {
|
||||
var params = new URLSearchParams(window.location.search);
|
||||
var queryLang = params.get("lang");
|
||||
if (queryLang) return normalizeLanguage(queryLang);
|
||||
|
||||
var saved = window.localStorage.getItem("preferredLang");
|
||||
if (saved) return normalizeLanguage(saved);
|
||||
|
||||
var browserLang = navigator.language || (navigator.languages && navigator.languages[0]) || fallback;
|
||||
return normalizeLanguage(browserLang);
|
||||
}
|
||||
|
||||
window.initPageI18n = function (translations) {
|
||||
var currentLanguage = getInitialLanguage();
|
||||
|
||||
function t(key) {
|
||||
var active = translations[currentLanguage] || translations[fallback] || {};
|
||||
if (Object.prototype.hasOwnProperty.call(active, key)) return active[key];
|
||||
return key;
|
||||
}
|
||||
|
||||
function applyLanguage(lang) {
|
||||
currentLanguage = normalizeLanguage(lang);
|
||||
var active = translations[currentLanguage] || translations[fallback] || {};
|
||||
|
||||
document.documentElement.lang = currentLanguage;
|
||||
if (active.pageTitle) document.title = active.pageTitle;
|
||||
|
||||
var nodes = document.querySelectorAll("[data-i18n]");
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
var key = nodes[i].getAttribute("data-i18n");
|
||||
if (Object.prototype.hasOwnProperty.call(active, key)) nodes[i].textContent = active[key];
|
||||
}
|
||||
|
||||
var placeholders = document.querySelectorAll("[data-i18n-placeholder]");
|
||||
for (var j = 0; j < placeholders.length; j++) {
|
||||
var pKey = placeholders[j].getAttribute("data-i18n-placeholder");
|
||||
if (Object.prototype.hasOwnProperty.call(active, pKey)) {
|
||||
placeholders[j].setAttribute("placeholder", active[pKey]);
|
||||
}
|
||||
}
|
||||
|
||||
var selector = document.getElementById("language-select");
|
||||
if (selector) selector.value = currentLanguage;
|
||||
|
||||
var links = document.querySelectorAll("a[data-lang-link]");
|
||||
for (var k = 0; k < links.length; k++) {
|
||||
var href = links[k].getAttribute("href");
|
||||
if (!href || href.indexOf("javascript:") === 0 || href.indexOf("#") === 0) continue;
|
||||
try {
|
||||
var linkUrl = new URL(href, window.location.origin);
|
||||
linkUrl.searchParams.set("lang", currentLanguage);
|
||||
links[k].setAttribute("href", linkUrl.pathname + linkUrl.search + linkUrl.hash);
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
var url = new URL(window.location.href);
|
||||
url.searchParams.set("lang", currentLanguage);
|
||||
window.history.replaceState({}, "", url.toString());
|
||||
}
|
||||
|
||||
var selector = document.getElementById("language-select");
|
||||
if (selector) {
|
||||
selector.addEventListener("change", function (event) {
|
||||
var chosen = normalizeLanguage(event.target.value);
|
||||
window.localStorage.setItem("preferredLang", chosen);
|
||||
applyLanguage(chosen);
|
||||
});
|
||||
}
|
||||
|
||||
applyLanguage(currentLanguage);
|
||||
|
||||
window.pageT = t;
|
||||
return {
|
||||
t: t,
|
||||
getLanguage: function () { return currentLanguage; },
|
||||
setLanguage: applyLanguage
|
||||
};
|
||||
};
|
||||
})();
|
||||
Reference in New Issue
Block a user