PLWL/src/i18n.js
2026-09-25 17:09:38 +02:00

54 lines
1.4 KiB
JavaScript

'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 }