feat(lang): supprime l'écran Redirection…, 302 serveur par Accept-Language/cookie, et traductions par fichier de langue (data/i18n/{fr,en}.json, éditables via Forgejo)
This commit is contained in:
parent
fc366811f7
commit
f2f1bd41e1
5 changed files with 251 additions and 210 deletions
|
|
@ -10,13 +10,18 @@
|
|||
return null
|
||||
}
|
||||
|
||||
function detect() {
|
||||
// Langue courante : préfixe d'URL, sinon cookie serveur (choix explicite via
|
||||
// /lang), sinon localStorage, sinon détection navigateur. FR par défaut.
|
||||
function pickLang() {
|
||||
var forced = urlLang()
|
||||
if (forced) return forced
|
||||
|
||||
var m = document.cookie.match(/(?:^|;\s*)zektyc-lang=([a-z]+)/)
|
||||
if (m && (m[1] === "fr" || m[1] === "en")) return m[1]
|
||||
|
||||
try {
|
||||
var stored = localStorage.getItem(STORAGE_KEY)
|
||||
if (stored && translations[stored]) return stored
|
||||
if (stored === "fr" || stored === "en") return stored
|
||||
} catch (e) {}
|
||||
|
||||
var candidates = []
|
||||
|
|
@ -35,6 +40,13 @@
|
|||
return DEFAULT_LANG
|
||||
}
|
||||
|
||||
function saveLang(lang) {
|
||||
try {
|
||||
localStorage.setItem(STORAGE_KEY, lang)
|
||||
} catch (e) {}
|
||||
document.cookie = "zektyc-lang=" + lang + "; Path=/; Max-Age=31536000"
|
||||
}
|
||||
|
||||
function apply(lang) {
|
||||
var dict = translations[lang]
|
||||
if (!dict) return
|
||||
|
|
@ -78,13 +90,14 @@
|
|||
}
|
||||
}
|
||||
|
||||
fetch("/data/i18n.json", { cache: "no-cache" })
|
||||
var lang = pickLang()
|
||||
fetch("/data/i18n/" + lang + ".json", { cache: "no-cache" })
|
||||
.then(function (res) {
|
||||
if (!res.ok) throw new Error("status " + res.status)
|
||||
return res.json()
|
||||
})
|
||||
.then(function (data) {
|
||||
if (data && typeof data === "object") translations = data
|
||||
if (data && typeof data === "object") translations[lang] = data
|
||||
})
|
||||
.catch(function (e) {
|
||||
if (window.console && console.warn) {
|
||||
|
|
@ -92,7 +105,7 @@
|
|||
}
|
||||
})
|
||||
.then(function () {
|
||||
var detected = detect()
|
||||
var detected = pickLang()
|
||||
if (window.console && console.info) {
|
||||
console.info(
|
||||
"[i18n] langue détectée:",
|
||||
|
|
@ -108,16 +121,14 @@
|
|||
document.addEventListener("click", function (e) {
|
||||
var btn = e.target.closest ? e.target.closest("[data-lang]") : null
|
||||
if (!btn) return
|
||||
var lang = btn.getAttribute("data-lang")
|
||||
if (!translations[lang]) return
|
||||
try {
|
||||
localStorage.setItem(STORAGE_KEY, lang)
|
||||
} catch (err) {}
|
||||
var langBtn = btn.getAttribute("data-lang")
|
||||
if (langBtn !== "fr" && langBtn !== "en") return
|
||||
saveLang(langBtn)
|
||||
|
||||
var currentPath = window.location.pathname
|
||||
var target = currentPath
|
||||
if (/^\/fr(\/|$)/.test(currentPath) || /^\/en(\/|$)/.test(currentPath)) {
|
||||
target = "".concat("/", lang, currentPath.slice(3))
|
||||
target = "".concat("/", langBtn, currentPath.slice(3))
|
||||
}
|
||||
if (window.location.pathname !== target) {
|
||||
window.location.href = target
|
||||
|
|
|
|||
Loading…
Reference in a new issue