function preferredLocale(language) { const tag = (language || "").toLowerCase(); const exact = SITE_LOCALES.find(locale => locale.toLowerCase() === tag); if (exact) return exact; const base = tag.split("-")[0]; if (base === "zh") { return /(?:^|-)hant(?:-|$)|(?:^|-)(tw|hk|mo)(?:-|$)/.test(tag) ? "zh-TW" : "zh-CN"; } return SITE_LOCALES.find(locale => locale.split("-")[0] === base) || "en-US"; } (() => { const storageKey = "ocs.site.language"; let saved; try { saved = localStorage.getItem(storageKey); } catch {} const locale = SITE_LOCALES.includes(saved) ? saved : preferredLocale(navigator.language); if ((location.pathname === "/" || location.pathname === "/index.html") && locale !== "en-US") { location.replace(`/${locale}/${location.search}${location.hash}`); } document.addEventListener("click", event => { const link = event.target.closest(".language-picker a[hreflang]"); if (link) { try { localStorage.setItem(storageKey, link.hreflang); } catch {} } else if (!event.target.closest(".language-picker")) { document.querySelector(".language-picker[open]")?.removeAttribute("open"); } }); document.addEventListener("keydown", event => { if (event.key !== "Escape") return; const picker = document.querySelector(".language-picker[open]"); if (picker) { picker.removeAttribute("open"); picker.querySelector("summary").focus(); } }); })();