54 lines
1.4 KiB
JavaScript
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 }
|