|
| 1 | +const userLang = navigator.language.startsWith("ko") |
| 2 | + ? "ko" |
| 3 | + : navigator.language.startsWith("ja") |
| 4 | + ? "ja" |
| 5 | + : navigator.language.startsWith("zh") |
| 6 | + ? "zh" |
| 7 | + : navigator.language.startsWith("es") |
| 8 | + ? "es" |
| 9 | + : navigator.language.startsWith("fr") |
| 10 | + ? "fr" |
| 11 | + : "en" |
| 12 | + |
| 13 | +const currentLang = localStorage.getItem("lang") ?? userLang |
| 14 | +document.documentElement.setAttribute("lang", currentLang) |
| 15 | + |
| 16 | +const emitLangChangeEvent = (lang: string) => { |
| 17 | + const event = new CustomEvent("langchange", { |
| 18 | + detail: { lang }, |
| 19 | + }) |
| 20 | + document.dispatchEvent(event) |
| 21 | +} |
| 22 | + |
| 23 | +const getCurrentPathWithoutLang = () => { |
| 24 | + const path = window.location.pathname |
| 25 | + const pathParts = path.split("/").filter((part) => part) |
| 26 | + |
| 27 | + if (pathParts[0] === "i18n") { |
| 28 | + pathParts.splice(0, 2) |
| 29 | + } |
| 30 | + return pathParts.join("/") |
| 31 | +} |
| 32 | + |
| 33 | +const navigateToUrl = async (url) => { |
| 34 | + try { |
| 35 | + const response = await fetch(url, { method: "HEAD" }) |
| 36 | + if (response.status === 404) { |
| 37 | + window.location.href = "/translate" |
| 38 | + } else { |
| 39 | + window.location.href = url |
| 40 | + } |
| 41 | + } catch (error) { |
| 42 | + console.error("Failed to check URL status:", error) |
| 43 | + window.location.href = "/translate" |
| 44 | + } |
| 45 | +} |
| 46 | + |
| 47 | +document.addEventListener("nav", () => { |
| 48 | + const switchLang = async (e: Event) => { |
| 49 | + const newLang = (e.target as HTMLSelectElement)?.value |
| 50 | + document.documentElement.setAttribute("lang", newLang) |
| 51 | + localStorage.setItem("lang", newLang) |
| 52 | + emitLangChangeEvent(newLang) |
| 53 | + |
| 54 | + const currentPath = getCurrentPathWithoutLang() |
| 55 | + const newUrl = newLang === "en" ? `/${currentPath}` : `/i18n/${newLang}/${currentPath}` |
| 56 | + |
| 57 | + await navigateToUrl(newUrl) |
| 58 | + } |
| 59 | + |
| 60 | + const langSelect = document.querySelector("#language-select") as HTMLSelectElement |
| 61 | + langSelect.addEventListener("change", switchLang) |
| 62 | + window.addCleanup(() => langSelect.removeEventListener("change", switchLang)) |
| 63 | + if (currentLang) { |
| 64 | + langSelect.value = currentLang |
| 65 | + } |
| 66 | +}) |
| 67 | + |
| 68 | +document.addEventListener("DOMContentLoaded", () => { |
| 69 | + const lang = localStorage.getItem("lang") ?? userLang |
| 70 | + document.documentElement.setAttribute("lang", lang) |
| 71 | + emitLangChangeEvent(lang) |
| 72 | +}) |
| 73 | + |
| 74 | +document.addEventListener("langchange", (event) => { |
| 75 | + const newLang = event.detail.lang |
| 76 | + console.log(`Language changed to: ${newLang}`) |
| 77 | + |
| 78 | + // Update language selector value |
| 79 | + const langSelect = document.querySelector("#language-select") as HTMLSelectElement |
| 80 | + if (langSelect) { |
| 81 | + langSelect.value = newLang |
| 82 | + } |
| 83 | +}) |
0 commit comments