btcpayserver.org/tasks/util.js
Dennis Reimann 274c05d4ba
Allow build without TRANSIFEX_TOKEN
This falls back to english only, but allows the build to be run.
2024-03-03 19:29:03 +01:00

134 lines
3.1 KiB
JavaScript

const { readFileSync, writeFileSync, mkdirSync } = require('fs')
const { dirname, resolve } = require('path')
const LANGUAGE_NAMES = {
am_ET: 'አማርኛ',
ar: 'العربية',
bg: 'български',
bs_BA: 'Bosanski',
ca_ES: 'Català',
cs_CZ: 'čeština',
da_DK: 'Dansk',
de_DE: 'Deutsch',
el_GR: 'Ελληνικά',
en: 'English',
en_GB: 'English',
es_ES: 'Español',
es_419: 'Spanish',
fa: 'فارسی',
fi_FI: 'Suomi',
fr_FR: 'Français',
he: 'עברית',
hi: 'हिन्दी',
hr: 'Hrvatski',
hu_HU: 'Magyar',
id: 'Indonesian',
it_IT: 'Italiano',
ja_JP: '日本語',
ko: '한국어',
lt: 'Lithuanian',
nl_NL: 'Nederlands',
no: 'Norwegian',
pl: 'Polski',
pt_BR: 'Português',
pt_PT: 'Português',
ro: 'Română',
ru_RU: 'русский',
sk_SK: 'Slovenčina',
sl_SI: 'Slovenščina',
sr: 'српски',
sv: 'Svenska',
th_TH: 'Thai',
tr: 'Türkçe',
uk: 'українська',
'zh-Hans': '中文',
zu: 'Zulu'
}
function getTemplate(name) {
const file = resolve(__dirname, `../src/${name}`)
try {
return readFileSync(file, 'utf8')
} catch (err) {
console.error('🚨 Could not get template', name, ':', err.message)
}
}
function getTransifexJSON(resource) {
const file = resolve(__dirname, `../transifex/download/${resource}.json`)
try {
const content = readFileSync(file, 'utf8')
return JSON.parse(content)
} catch (err) {
console.error('🚨 Could not read file', file, ':', err.message)
}
}
function getContributorJSON(resource) {
const file = resolve(__dirname, `../github/contributors.json`)
try {
const content = readFileSync(file, 'utf8')
return JSON.parse(content)
} catch (err) {
console.error('🚨 Could not read file', file, ':', err.message)
}
}
// returns an array of available languages.
// here we can also filter based on completeness.
function getLanguages (resource, completenessThreshold = 80) {
try {
const stats = getTransifexJSON(resource)
return Object.keys(stats).reduce((res, lang) => {
const { total_words, translated_words } = stats[lang]
const completeness = (translated_words / total_words) * 100
if (completeness >= completenessThreshold) res.push(lang)
return res
}, []).sort()
} catch(err) {
console.error(err.message)
return ['en_GB']
}
}
function getLanguageName (code) {
return LANGUAGE_NAMES[code]
}
function replaceTemplateVars(tmpl, vars) {
return Object.keys(vars).reduce((rendered, varName) => {
const value = vars[varName]
const regex = new RegExp(`\\{\\{\s?${varName}\s?\\}\\}`, 'g')
return value instanceof Array
? rendered.replace(regex, (_, i) => value[i])
: rendered.replace(regex, value)
}, tmpl)
}
function saveFile (filePath, content) {
const file = resolve(__dirname, `../dist/${filePath}`)
try {
mkdirSync(dirname(file), { recursive: true })
writeFileSync(file, content)
} catch (err) {
console.error('🚨 Could not save file', file, ':', err)
}
}
module.exports = {
getTemplate,
getLanguages,
getLanguageName,
getTransifexJSON,
replaceTemplateVars,
saveFile,
getContributorJSON
}