'use strict' const fsp = require('fs').promises const path = require('path') const { DIRS } = require('./paths') const FALLBACK = 'en-us' let cache = {} async function loadLang(code) { const file = path.join(DIRS.TRANSLATIONS, `${code}.json`) try { const raw = await fsp.readFile(file, 'utf8') const parsed = JSON.parse(raw) cache[code] = parsed return parsed } catch { return null } } async function init() { const files = await fsp.readdir(DIRS.TRANSLATIONS).catch(() => []) const langs = [] for (const f of files) { if (!f.endsWith('.json')) continue const lang = await loadLang(f.replace(/\.json$/, '')) if (lang && lang.data && lang.texts) langs.push(lang) } return langs } function listLangs() { return Object.entries(cache).map(([code, lang]) => ({ code, nameEn: (lang.data && lang.data.nameEn) || code, nameSelf: (lang.data && lang.data.nameSelf) || code })) } function getLang(code) { return cache[code] || cache[FALLBACK] || { texts: {}, data: {} } } function translate(code, key, ...args) { const lang = getLang(code) let text = (lang.texts && lang.texts[key]) ?? (cache[FALLBACK] && cache[FALLBACK].texts && cache[FALLBACK].texts[key]) ?? key args.forEach((v, i) => { text = String(text).split(`{${i}}`).join(String(v)) }) return text } module.exports = { init, listLangs, getLang, translate, loadLang, FALLBACK }