feat(easel): add localization
This commit is contained in:
62
static/src/language.ts
Normal file
62
static/src/language.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
(() => {
|
||||
const getStoredLanguage = () => {
|
||||
const m = document.cookie.match(/language=(\w+)/);
|
||||
return m ? m[1] : null;
|
||||
};
|
||||
const setStoredLanguage = (language: string) => (document.cookie = `language=${language}; max-age=34560000; path=/`);
|
||||
|
||||
const getPreferredLanguage = () => {
|
||||
const storedLanguage = getStoredLanguage();
|
||||
if (storedLanguage) {
|
||||
return storedLanguage;
|
||||
}
|
||||
const result = window.navigator.language.split("-")[0];
|
||||
return ["en", "ru"].includes(result) ? result : "en";
|
||||
};
|
||||
|
||||
const setLanguage = (language: string) => {};
|
||||
|
||||
setLanguage(getPreferredLanguage());
|
||||
|
||||
const showActiveLanguage = (language: string, focus = false) => {
|
||||
const languageSwitcher = document.querySelector("#bd-language");
|
||||
|
||||
if (!languageSwitcher) {
|
||||
return;
|
||||
}
|
||||
|
||||
const languageSwitcherText = document.querySelector("#bd-language-text");
|
||||
const activeLanguageIcon = document.querySelector(".language-icon-active");
|
||||
const btnToActive = document.querySelector(`[data-bs-language-value="${language}"]`);
|
||||
const activeLanguageIconContent = btnToActive?.querySelector("span")?.textContent;
|
||||
|
||||
document.querySelectorAll("[data-bs-language-value]").forEach((element) => {
|
||||
element.classList.remove("active");
|
||||
element.setAttribute("aria-pressed", "false");
|
||||
});
|
||||
|
||||
btnToActive.classList.add("active");
|
||||
btnToActive.setAttribute("aria-pressed", "true");
|
||||
activeLanguageIcon.textContent = activeLanguageIconContent;
|
||||
const languageSwitcherLabel = `${languageSwitcherText.textContent} (${btnToActive.dataset.bsLanguageValue})`;
|
||||
languageSwitcher.setAttribute("aria-label", languageSwitcherLabel);
|
||||
|
||||
if (focus) {
|
||||
languageSwitcher.focus();
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
showActiveLanguage(getPreferredLanguage());
|
||||
|
||||
document.querySelectorAll("[data-bs-language-value]").forEach((toggle) => {
|
||||
toggle.addEventListener("click", () => {
|
||||
const language = toggle.getAttribute("data-bs-language-value") || "";
|
||||
setStoredLanguage(language);
|
||||
setLanguage(language);
|
||||
showActiveLanguage(language, true);
|
||||
window.location.reload();
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user