Files
BagExchange/static/js/simple_i18n.js
2026-02-15 17:09:19 +01:00

99 lines
3.4 KiB
JavaScript

(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
};
};
})();