From eb5283882bc57c4a2d0ef57f5d698eb8d6a6aa87 Mon Sep 17 00:00:00 2001 From: Aelita4 Date: Sat, 11 Nov 2023 23:28:14 +0100 Subject: [PATCH] Add basic language support --- src/lib/lang/en/game.json | 9 ++++++ src/lib/lang/en/navbar.json | 8 ++++++ src/lib/lang/en/resources.json | 7 +++++ src/lib/lang/langDriver.ts | 50 ++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/lib/lang/en/game.json create mode 100644 src/lib/lang/en/navbar.json create mode 100644 src/lib/lang/en/resources.json create mode 100644 src/lib/lang/langDriver.ts diff --git a/src/lib/lang/en/game.json b/src/lib/lang/en/game.json new file mode 100644 index 0000000..8ddaee2 --- /dev/null +++ b/src/lib/lang/en/game.json @@ -0,0 +1,9 @@ +{ + "Header": { + "user": "user {}" + }, + "Link": { + "logout": "Log out", + "build": "Build {}" + } +} \ No newline at end of file diff --git a/src/lib/lang/en/navbar.json b/src/lib/lang/en/navbar.json new file mode 100644 index 0000000..e0ab79a --- /dev/null +++ b/src/lib/lang/en/navbar.json @@ -0,0 +1,8 @@ +{ + "Link": { + "home": "home", + "login": "login", + "register": "register", + "dropdown": "dropdown" + } +} \ No newline at end of file diff --git a/src/lib/lang/en/resources.json b/src/lib/lang/en/resources.json new file mode 100644 index 0000000..eddd436 --- /dev/null +++ b/src/lib/lang/en/resources.json @@ -0,0 +1,7 @@ +{ + "Label": { + "coal": "Coal", + "iron": "Iron", + "gold": "Gold" + } +} \ No newline at end of file diff --git a/src/lib/lang/langDriver.ts b/src/lib/lang/langDriver.ts new file mode 100644 index 0000000..598c1f9 --- /dev/null +++ b/src/lib/lang/langDriver.ts @@ -0,0 +1,50 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +export function getSupportedLanguages() { + const supportedLanguages = fs.readdirSync(path.dirname(fileURLToPath(import.meta.url))).filter((file: string) => { + return fs.statSync(path.join(path.dirname(fileURLToPath(import.meta.url)), file)).isDirectory(); + }); + + return supportedLanguages; +} + +export function getHighestWeightedLanguage(header: string | null): any { + if(header === null) return 'en'; + const supportedLanguages = getSupportedLanguages(); + + const langs = header.split(','); + let highestWeight = 0; + let highestWeightedLang = 'en'; + + for(const lang of langs) { + const subArray = lang.split(";"); + const langName = subArray[0]; + const langWeight = subArray.filter((sub: string) => sub.includes("q=")).length > 0 ? parseFloat(subArray.filter((sub: string) => sub.includes("q="))[0].split("=")[1]) : 1; + + if(langWeight > highestWeight && supportedLanguages.includes(langName)) { + highestWeight = langWeight; + highestWeightedLang = langName; + } + } + + return highestWeightedLang; +} + +export async function getLocales(language: string, type: string) { + if(!getSupportedLanguages().includes(language)) { + return null; + } + + const lang = (await import(`./${language}/${type}.json`)).default; + const out: any = {}; + + for(const category in lang) { + for(const element in lang[category]) { + out[`${category}_${element}`] = lang[category][element]; + } + } + + return out; +} \ No newline at end of file