1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
const LANGUAGES = [
"ar", "de", "en", "es", "eu",
"fi", "fr", "he", "ja", "nl",
"pl", "pt", "to", "tr",
"zh_Hans", "zh_Hant",
]
let TR: { [key: string]: string } = {}
export async function init_locale(lang?: string) {
if (!lang) return await init_locale(select_language())
const res = await fetch(`/locale/${encodeURIComponent(lang)}.json`, { headers: { "Accept": "application/json" } })
if (!res.ok) throw new Error("language pack download failed");
TR = await res.json()
}
export function tr(key: string, ...args: string[]): string {
let s = TR[key] ?? key;
if (args.length)
s = s.replace(/%(s|i)/ig, () => args.shift() ?? "[not provided]")
return s
}
function select_language(): string {
const plang = (new URLSearchParams(globalThis.location.hash.substring(1))).get("lang")
if (plang) return plang
const navlang = navigator.language.split("-")[0] ?? "en"
if (LANGUAGES.includes(navlang)) return navlang
console.warn("fallback language selected");
return "en"
}
|