Files
unifi-voucher-site/modules/translation.js

49 lines
1.5 KiB
JavaScript

/**
* Import base packages
*/
const fs = require('fs');
/**
* Import own modules
*/
const log = require('./log');
const variables = require('./variables');
/**
* Translation returns translator function
*
* @param module
* @param language
* @param fallback
* @return {(function(key: string): (string))}
*/
module.exports = (module, language = 'en', fallback = 'en') => {
// Prevent users from escaping the filesystem
if(!new RegExp(/^[a-zA-Z]*$/).test(language)) {
log.error(`[Translation] Detected path escalation! Forcing fallback and skipping user input...`);
language = fallback;
}
// Check if translation file exists
if(!fs.existsSync(`${__dirname}/../locales/${language}/${module}.json`)) {
log.warn(`[Translation] Missing translation file: ${__dirname}/../locales/${language}/${module}.json`);
language = fallback;
log.warn(`[Translation] Using fallback: ${__dirname}/../locales/${language}/${module}.json`);
}
// Get translation file
const translations = JSON.parse(fs.readFileSync(`${__dirname}/../locales/${language}/${module}.json`, 'utf-8'));
// Return translate function
return (key) => {
// Check if key exists within translation file
if(typeof translations[key] === 'undefined') {
log.warn(`[Translation][${language}] Missing for key: ${key}`);
return `%${key}%`;
}
// Check if debugging is enabled. If enabled only return key
return variables.translationDebug ? `t('${key}')` : translations[key];
};
};