Files
APS/.github/theme/language-switcher.js
2026-05-07 13:47:55 +03:00

149 lines
3.3 KiB
JavaScript

(function () {
"use strict";
const STORAGE_KEY = "book-language";
// ---------------------------------
// Current language from URL
// ---------------------------------
function currentLang() {
return /\/en\//.test(window.location.pathname) ? "en" : "ru";
}
// ---------------------------------
// Browser language
// ---------------------------------
function preferredLang() {
const langs = navigator.languages || [
navigator.language || "en",
];
const isRussian = langs.some((lang) =>
lang.toLowerCase().startsWith("ru")
);
return isRussian ? "ru" : "en";
}
// ---------------------------------
// URL conversion
// ---------------------------------
function pathForLang(lang) {
const path = window.location.pathname;
if (lang === "en") {
if (/\/en\//.test(path)) {
return path;
}
// /APS/foo → /APS/en/foo
return path.replace(/^(\/[^\/]+\/)/, "$1en/");
}
// lang === "ru"
// /APS/en/foo → /APS/foo
return path.replace("/en/", "/");
}
// ---------------------------------
// Switch language manually
// ---------------------------------
function switchLanguage() {
const newLang = currentLang() === "ru" ? "en" : "ru";
// Save explicit user choice
localStorage.setItem(STORAGE_KEY, newLang);
window.location.href =
pathForLang(newLang) +
window.location.search +
window.location.hash;
}
// ---------------------------------
// Automatic language selection
// ---------------------------------
function autoSelectLanguage() {
const current = currentLang();
// 1. User preference has priority
let desired = localStorage.getItem(STORAGE_KEY);
// 2. Otherwise use browser language
if (!desired) {
desired = preferredLang();
}
// Already correct
if (desired === current) {
return;
}
// Redirect
window.location.replace(
pathForLang(desired) +
window.location.search +
window.location.hash
);
}
// ---------------------------------
// UI
// ---------------------------------
function addSwitcher() {
const lang = currentLang();
const btn = document.createElement("button");
btn.id = "language-switcher";
btn.setAttribute(
"title",
lang === "ru"
? "Switch to English"
: "Переключить на русский"
);
btn.setAttribute("aria-label", btn.getAttribute("title"));
const icon = document.createElement("span");
icon.setAttribute("aria-hidden", "true");
icon.textContent = lang === "ru" ? "🇬🇧" : "🇷🇺";
const label = document.createElement("span");
label.className = "lang-label";
label.textContent = lang === "ru" ? "EN" : "RU";
btn.appendChild(icon);
btn.appendChild(label);
btn.addEventListener("click", switchLanguage);
const target = document.querySelector(".right-buttons");
if (target) {
target.insertBefore(btn, target.firstChild);
}
}
// ---------------------------------
// Init
// ---------------------------------
function init() {
autoSelectLanguage();
addSwitcher();
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();