passed/static/js/lang.js
2025-05-23 22:22:18 +02:00

79 lines
No EOL
1.6 KiB
JavaScript

class Language {
#storageKey
#languages
#language
#errorHandler
#defaultLang
constructor(errorHandler, defaultLang) {
this.#storageKey = "language"
this.#languages = new Map()
this.#errorHandler = errorHandler
this.#defaultLang = defaultLang
const setLanguage = localStorage.getItem(this.#storageKey)
if (setLanguage == null) {
this.setLanguage(this.#defaultLang)
this.#language = this.#defaultLang
return
}
this.#language = setLanguage
this.setLanguage(this.#language)
}
async #fetchLanguage(lang) {
const cached = this.#languages.get(lang)
if (cached != null) {
return cached
}
const f = await fetch(`/lang/${lang}.json`)
const fetched = await f.json()
this.#languages.set(lang, fetched)
return fetched
}
#translate(key, ...args) {
let bundle = this.#languages.get(this.#language)
if (bundle == null) {
bundle = {}
}
let value = bundle[key];
if (value == undefined) {
value = key
}
for (let i = 0; i < args.length; i++) {
value = value.replaceAll(`{${i}}`, args[i])
}
return value
}
#translatePage() {
const elements = document.getElementsByTagName("*")
for (const element of elements) {
const key = element.getAttribute("t")
if (key == null) {
continue
}
element.innerHTML = this.#translate(key)
}
}
setLanguage(lang) {
this.#fetchLanguage(lang)
.then(() => {
this.#language = lang
localStorage.setItem(this.#storageKey, lang)
this.#translatePage()
})
.catch((err) => this.#errorHandler(err))
}
}