99 lines
3.4 KiB
JavaScript
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
|
|
};
|
|
};
|
|
})();
|