Zonies-Bot/handlers/translation.js
2025-05-12 12:57:59 -05:00

98 lines
2.5 KiB
JavaScript

const color = require("../functions/colorCodes")
class TranslationHandler {
constructor(languages) {
this.availableLanguages = languages ?? [
'en_EN',
// 'es_ES',
//'ar_AR',
// 'pt_BR',
//'sk_SK',
];
this.translations = {};
for (const l of this.availableLanguages) {
const data = require(`../languages/${l}.json`);
this.initLanguage(l, data);
}
console.log(color("%", `%b[Translation_Handler]%7 :: Loaded %e${this.availableLanguages.length} %7languages`));
}
initLanguage(key, language) {
this.translations[key] = language;
}
checkRegex(value) {
return /^[a-z]{2}_[A-Z]{2}$/.test(value);
}
getLanguage(language) {
if (!this.checkRegex(language)) return this.translations['en_EN'];
return this.translations[language];
}
addLanguage(language) {
if (!this.checkRegex(language)) {
throw new Error('Invalid language format. Example: en_EN');
}
this.availableLanguages.push(language);
}
reload() {
this.translations = {};
for (const l of this.availableLanguages) {
try {
const d = require(`../languages/${l}.json`);
if (!d) continue;
this.initLanguage(l, d);
return "Success"
} catch (e) {
return e.message;
}
}
}
get(language, path, data = {}) {
if (!language) language = 'en_EN';
const l = this.getLanguage(language);
const p = path.split('.');
let c = null;
if (p.length > 0) {
for (const i of p) {
try {
if (!c) {
if (!l.hasOwnProperty(i)) break;
c = l[i];
} else {
if (!c.hasOwnProperty(i)) break;
c = c[i];
}
} catch (err) {
break;
}
}
} else {
return `Unknown translation: ${language} | ${path}`;;
}
if (!c) return `Unknown translation: ${language} | ${path}`;;
if (data) {
try {
return c.replace(/{(\w+)}/g, (match, key) => data[key] ?? match);
} catch (e) {
return `Unknown translation: ${language} | ${path}`;
}
}
return c;
}
};
module.exports = TranslationHandler;